1

IP アドレスを格納するためのフィールドがあり、このコードを使用して IPv4 アドレスを整数に変換しているので、ソート可能なバージョンのアドレスを別の bigint フィールドに保存して、より自然なソートを実現できます (これに基づく):

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を使用しています

4

2 に答える 2

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の使用が機能しました

于 2013-11-13T22:00:28.043 に答える