2つのintフィールド(IP、マスク)でIP範囲を定義するDjangoモデルを照会する方法
-
05-07-2019 - |
質問
私は持っています:
class Range(models.Model):
ip = models.IntegerField() # as produced by socket.inet_aton + struct.unpack
mask = models.IntegerField()
特定のIPが与えられた場合、Djangoモデルを使用して、この特定のIPに一致するすべての範囲を取得するにはどうすればよいですか?
生のSQLを使用している場合、データベースのビット演算子を使用しますが、Django ORMはそれらをサポートしません。
解決
Django 1.0のQuerySet APIには、こちら。追加のメソッドを使用すると、カスタムWHERE句をQuerySetに渡すことができます。これにより、必要なビット単位の比較を使用できるようになります。
他のヒント
範囲に適合するより高速なクエリを実行するには、範囲の下限と上限のIPを整数として保存することをお勧めします。次に、必要なオブジェクトの選択は、 Range.objects.filter(ip_low__le = ip、ip_up__ge = ip)
のように簡単にする必要があります。
Pythonのiptoolsの使用をお勧めします:
所属していません StackOverflow