2つのintフィールド(IP、マスク)でIP範囲を定義するDjangoモデルを照会する方法

StackOverflow https://stackoverflow.com/questions/1610227

  •  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の使用をお勧めします:

http://code.google.com/p/python-iptools/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top