如何通过Django管理站点中的GenericIPAddressField对模型进行数字排序?
在模型中使用Meta.ordering将其按如下方式排序:
但我希望它像这样排序:
答案 0 :(得分:1)
您可以使用的一个解决方案是将IP地址转换为int,并将其存储在数据库中。
基本上你拿IP地址并在每个.
上拆分。
这会给你类似的东西:
Octet 1: 192
Octet 2: 168
Octet 3: 1
Octet 4: 10
然后使用以下数学为您提供可以订购的整数。
(Octet1 * 256^3) + (Octet2 * 256^2) + (Octet3 * 256) + (Octet4)
3221225472 + 11010048 + 256 + 10 = 3232235786
可在此处找到更多信息:http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp
答案 1 :(得分:0)
这不是您想听到的答案,但您的数据库可能不支持IP地址字段类型,因此Django使用带有文本排序语义的文本字段类型。
PostgreSQL本身支持IP地址(包括IPv4和IPv6),包括自然排序。
答案 2 :(得分:0)
根据intgr关于IPv6的评论,我只想包括我最终使用的代码,这是基于Matt存储整数版IP的方法,但与IPv6很好地配合。
import socket, struct
def ip_to_int(ip):
ip = unicode(ip)
try:
return struct.unpack('!I', socket.inet_pton(socket.AF_INET, ip))[0]
except socket.error:
try:
hi, lo = struct.unpack('!QQ', socket.inet_pton(socket.AF_INET6, ip))
return (hi << 64) | lo
except socket.error:
return 0
不幸的是,如果我自己写这篇文章或者我在网上找到它,我现在不记得了,所以如果信用到期,我就不能给予信任。