Как запросить модель Django, определяющую диапазон IP с двумя полями int (IP, mask) - PullRequest
2 голосов
/ 23 октября 2009

у меня есть:

class Range(models.Model):
    ip = models.IntegerField() # as produced by socket.inet_aton + struct.unpack
    mask = models.IntegerField()

Учитывая определенный IP-адрес, как я могу получить все диапазоны, которые соответствуют этому конкретному IP-адресу, с использованием моделей Django?

Если бы я использовал сырой SQL, я бы использовал побитовые операторы базы данных, но Django ORM их не поддерживает.

Ответы [ 3 ]

4 голосов
/ 23 октября 2009

API QuerySet в Django 1.0 теперь включает в себя дополнительный метод, описанный здесь в документации Django. Дополнительный метод позволяет передавать пользовательские предложения WHERE в ваш QuerySet, что должно позволить вам использовать побитовое сравнение, которое вам нужно.

2 голосов
/ 23 октября 2009

Чтобы выполнить более быстрый запрос, подгоняющий диапазон, лучше хранить нижний и верхний IP диапазона в виде целого числа. Тогда выбор необходимых объектов должен быть простым: Range.objects.filter(ip_low__le=ip, ip_up__ge=ip).

0 голосов
/ 14 ноября 2010

Я бы порекомендовал использовать iptools для Python:

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

...