2010-06-14 1 views
13

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

Так что, если у меня есть 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. 

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

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

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


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

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

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

{ 'state': 'AL' } 

ответ

14

Вы можете сделать, как говорит 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). Затем вы можете сериализовать эти объекты и сохранить их в базе данных в виде строк.

--edit--

Если вам нужно иметь все условия на одной записи базы данных, вы можете хранить их в словаре

{'filter_conditions': (cond_1, cond_2, cond_3), 'exclude_conditions': (cond_4, cond_5)} 

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

1

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

И после этого вы можете использовать Q object установить QuerySet для вашей модели.

+0

Хотели бы вы рассказать о том, как это касается проблемы получения критериев запроса и сохранения их в базе данных, а затем восстановления m база данных и ее выполнение? – cethegeek

4

Вы можете сохранить 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)) 
+3

В недавнем Django это теперь .query(). – Cerin