Я хотел бы сохранить queryset критерии к DB для повторного использования.
Так, если у меня есть queryset как:
Client.objects.filter(state='AL')
# I'm simplifying the problem for readability. In reality I could have
# a very complex queryset, with multiple filters, excludes and even Q() objects.
Я хотел бы сохранить к DB не результаты queryset (т.е. отдельные клиентские записи, которые имеют поле состояния, соответствующее 'AL'); но сам queryset (т.е. критерии, используемые в фильтрации модели Client).
Конечная цель должна иметь "сохраненный фильтр", который может читаться из DB и использоваться несколькими django приложениями.
Сначала я думал, что мог сериализировать queryset и сохранить это. Но сериализация queryset на самом деле выполняет запрос - и затем я заканчиваю со статическим списком клиентов в Алабаме во время сериализации. Я хочу, чтобы список был динамичным (т.е. каждый раз, когда я считал queryset из DB, он должен выполнить и получить актуальнейший список клиентов в Алабаме).
Править: С другой стороны, действительно ли возможно получить список фильтров, относился к queryset?
Что-то как:
qs = Client.objects.filter(state='AL')
filters = qs.getFilters()
print filters
{ 'state': 'AL' }
Вы можете сделать, как говорит jcd, сохраняя sql.
Вы также можете сохранить условия.
In [44]: q=Q( Q(content_type__model="User") | Q(content_type__model="Group"),content_type__app_label="auth")
In [45]: c={'name__startswith':'Can add'}
In [46]: Permission.objects.filter(q).filter(**c)
Out[46]: [<Permission: auth | group | Can add group>, <Permission: auth | user | Can add user>]
In [48]: q2=Q( Q(content_type__model="User") | Q(content_type__model="Group"),content_type__app_label="auth", name__startswith='Can add')
In [49]: Permission.objects.filter(q2)
Out[49]: [<Permission: auth | group | Can add group>, <Permission: auth | user | Can add user>]
В этом примере вы видите, что условиями являются объекты c
и q
(хотя они могут быть объединены в один объект, q2
). Затем вы можете сериализовать эти объекты и сохранить их в базе данных в виде строк.
- изменить -
Если вам нужно иметь все условия для одной записи базы данных, вы можете сохранить их в словаре
{'filter_conditions': (cond_1, cond_2, cond_3), 'exclude_conditions': (cond_4, cond_5)}
, а затем сериализовать словарь.
вы можете создать свою собственную модель для хранения ваших запросов. Первое поле может содержать от fk до ContentTypes Второе поле может быть просто текстовым полем с вашим запросом и т. Д.
И после этого вы можете использовать объект Q для установки набора запросов для вашей модели.
Вы можете хранить sql, сгенерированный запросом, используя метод _as_sql()
queryset'а. Метод принимает в качестве аргумента соединение с базой данных, поэтому вы можете сделать следующее:
from app.models import MyModel
from django.db import connection
qs = MyModel.filter(pk__gt=56, published_date__lt=datetime.now())
store_query(qs._as_sql(connection))