Как получить и/или сохранить queryset критерии к DB?

Я хотел бы сохранить 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' }
15
задан cethegeek 14 July 2010 в 18:41
поделиться

3 ответа

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

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

15
ответ дан 1 December 2019 в 02:45
поделиться

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

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

1
ответ дан 1 December 2019 в 02:45
поделиться

Вы можете хранить 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))
4
ответ дан 1 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: