#2191 closed defect (wontfix)
Ordering of IpAddressField ist not natural
Reported by: | Owned by: | Adrian Holovaty | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The ordering of IpAddressField is not natural which doesn't look very well on large lists.
I think for platform and backwards compatibility a change to a interger field are out of scope.
I found http://www.jimgrill.com/pages/content/sortip which would allow at least with mysql a natural sorting of IpAddressFields. For Postgresql i haven't found a function yet, only for the inet/cidr row types.
Change History (3)
comment:1 by , 18 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
comment:2 by , 18 years ago
Year :)
I just was wondering, are there any other types of fields that don't sort correctly, so it would be good to add some generic functionality that would allow fields to be sorted based on type and database ?
comment:3 by , 18 years ago
I was also fighting with this issue yesterday. I was able to get the sorting to work by using an integer field, which was generated on each save:
class SomeModel(models.Model): ip_address = models.CharField(maxlength=255) bin_ip = models.IntegerField() ... def save(self): sets = map(int, self.ip_address.split(".")) self.bin_ip = sets[0]*256**3 + sets[1]*256**2 + sets[2]*256 + sets[3] print self.bin_ip super(IP, self).save()
Now, to order all SomeModels by IP, one must order by bin_ip, not by ip_address. This works and only downside I have found so far is that the bin_ip must be included in Admin list_display to allow sorting by IP manually. However, if the IP would be saved as an integer that could be converted back to IP address, I think that a custom field would make it.
I think this is one we're just going to have to ignore and live with. It'd be too much of a special case to get it fixed.