在Django管理站点中按GenericIPAddressField排序

时间:2013-11-06 20:07:00

标签: django django-models django-admin

如何通过Django管理站点中的GenericIPAddressField对模型进行数字排序?

在模型中使用Meta.ordering将其按如下方式排序:

  • 192.168.1.1
  • 192.168.1.15
  • 192.168.1.9

但我希望它像这样排序:

  • 192.168.1.1
  • 192.168.1.9
  • 192.168.1.15

3 个答案:

答案 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

不幸的是,如果我自己写这篇文章或者我在网上找到它,我现在不记得了,所以如果信用到期,我就不能给予信任。