Как получить и / или сохранить критерии набора запросов в БД? - PullRequest
15 голосов
/ 14 июня 2010

Я хотел бы сохранить критерии набора запросов в БД для повторного использования.

Итак, если у меня есть такой набор запросов, как:

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.

Я бы хотел сохранить в БД не результаты набора запросов (т. Е. Отдельные записи клиента, которые имеют соответствующее поле состояния'AL');но сам набор запросов (т. е. критерии, используемые при фильтрации модели клиента).

Конечная цель - создать «сохраненный фильтр», который можно читать из БД и использовать в нескольких приложениях django.

Сначала я подумал, что могу сериализовать набор запросов и сохранить его.Но сериализация набора запросов фактически выполняет запрос - и тогда я получаю статический список клиентов в Алабаме во время сериализации.Я хочу, чтобы список был динамическим (т. Е. Каждый раз, когда я читаю набор запросов из БД, он должен выполнять и получать самый последний список клиентов в Алабаме).


Редактировать: В качестве альтернативы, возможно липолучить список фильтров, примененных к набору запросов?

Что-то вроде:

qs = Client.objects.filter(state='AL')
filters = qs.getFilters()
print filters

{ 'state': 'AL' }

Ответы [ 5 ]

15 голосов
/ 15 июля 2010

Вы можете делать, как говорит 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)} 

и затем сериализовать словарь.

4 голосов
/ 15 июня 2010

Вы можете сохранить sql, сгенерированный запросом, используя метод _as_sql() набора запросов.Метод принимает соединение с базой данных в качестве аргумента, поэтому вы должны сделать:

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))
3 голосов
/ 26 февраля 2013

Вы можете выбрать объект Query (не QuerySet):

>>> import pickle
>>> query = pickle.loads(s)     # Assuming 's' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query            # Restore the original 'query'.

Документы: https://docs.djangoproject.com/en/dev/ref/models/querysets/#pickling-querysets

Но: вы не можете делить соленья между версиями

3 голосов
/ 04 мая 2012

Вы можете использовать http://github.com/denz/django-stored-queryset для этого

1 голос
/ 15 июня 2010

вы можете создать свою собственную модель для хранения ваших запросов.Первое поле может содержать от fk до ContentTypes Второе поле может быть просто текстовым полем с вашим запросом и т. Д.

И после этого вы можете использовать Объект Q , чтобы установить набор запросов для вашегомодель.

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