Сравнение IPet inet PostgreSQL с использованием django - PullRequest
1 голос
/ 01 апреля 2019

В моей базе данных PostgreSQL у меня есть таблица сетевых устройств.

Я создаю приложение django, которое должно взаимодействовать с этой таблицей.Я использую модели с методами .get () и .filter (), но я не уверен, как справиться со следующим запросом:

select * from my_table where ip << inet '10.93.1/24'

Это должно получить записи типа 10.93.1.*, но не 10.93.13.*, поэтому я не могу просто использовать:

items = MyTable.objects.filter(ip__startswith='10.93.1')

Что такое эквивалент django для этого запроса?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Я нашел простое решение: вместо filter я использую другой QuerySet метод - extra.

Итак, вот мой код:

objList = MyTable.objects.extra(where=["ip << inet '{}'".format(ip)])

Примечание: where аргумент метода extra ожидает список. Затем он обрабатывает каждый элемент списка как условие и объединяет их с AND. Итак, передавая только строку:

objList = MyTable.objects.extra(where="ip << inet '{}'".format(ip))

заставит extra рассматривать эту строку как список символов, что приведет к запросу:

...WHERE (i) AND (p) AND ( ) AND (<) AND (<) AND ( ) AND (i) AND (n) AND (e) AND (t) AND ( ) AND (') AND (1) AND (0) AND (.) AND (9) AND (3) AND (.) AND (1) AND (/) AND (2) AND (4) AND (')
0 голосов
/ 01 апреля 2019

Для этого нет поиска по умолчанию (начиная с версии 2.2), но легко создать :

from django.db.models import GenericIPAddressField
from django.db.models import Lookup

@GenericIPAddressField.register_lookup
class ContainedIn(Lookup):
    lookup_name = 'iscontainedin'

    def as_postgresql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s << inet %s' % (lhs, rhs), params

. Затем вы можете использовать поиск с __iscontainedin:

MyTable.objects.filter(ip__iscontainedin='10.93.1/24')

Жаль, что шаблон, связанный с созданием поиска.Если вы используете это только один раз, запрос extra действительно меньше проблем.При повторном использовании поиск с соответствующим именем будет более читабельным и требует меньше кода для обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...