在数据库中对IPv4和IPv6地址进行排序

时间:2013-11-13 20:40:47

标签: python django

我有一个用于存储IP地址的字段,我正在使用此代码将IPv4地址转换为整数,因此我可以在单独的bigint字段中保存地址的可排序版本,以实现更自然的排序(基于{ {3}}):

octets = ip.split('.')
return (int(octets[0]) * 256**3) + (int(octets[1]) * 256**2) + (int(octets[2]) * 256) + (int(octets[3]))

如何使用与bigint字段太大的IPv6地址类似的东西?

有没有一种简单的方法来进行IPv6的整数转换? Python3似乎提供了“ipaddress”模块,但我使用的是2.7。我想支持各种方法将零丢弃在地址之外。

更新:我正在使用Django 1.5

2 个答案:

答案 0 :(得分:1)

我最终使用此代码将IP转换为整数:

import struct, socket

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

根据kroolik

的建议,使用DecimalField

答案 1 :(得分:-1)

我相信我会在。上拆分IPv4地址,并按列表排序。 类似地,对于IPv6,我会尝试拆分:,并将它们排序为列表。

如果行为需要在某一天发生变化,将其作为一个课程包装起来可能是一个好主意。这样,如果它确实发生了变化,则更改不会分散在您的代码中。