2010-06-14 6 views
13

Chciałbym zapisać kryteria queryset do DB do ponownego użycia.Jak uzyskać i/lub zapisać kryteria zapytania do bazy danych?

Więc jeśli mam queryset jak:

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. 

Chciałbym zapisać się do DB nie wyniki queryset (tj zapisami poszczególnych klientów, które mają dopasowanie pola państwowego „AL”) ; ale sam zestaw zapytań (tj. kryteria stosowane w filtrowaniu modelu klienta).

Ostatecznym celem jest posiadanie "zapisanego filtru", który można odczytać z bazy danych i użyć go w wielu aplikacjach django.

Najpierw myślałem, że mogę serializować zapytanie i zapisać. Ale serializowanie zapytania powoduje wykonanie kwerendy - a potem kończy się statyczną listą klientów w Alabamie w momencie serializacji. Chcę, aby lista była dynamiczna (tj. Za każdym razem, gdy czytam zestaw zapytań z DB, powinien on wykonać i pobrać najbardziej aktualną listę klientów w Alabamie).


Edycja: Alternatywnie, czy możliwe jest uzyskanie listy filtrów zastosowanych do zestawu zapytań?

Coś jak:

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

{ 'state': 'AL' } 

Odpowiedz

14

Można zrobić jak mówi JCD, przechowywanie sql.

Możesz również zapisać warunki.

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>] 

W tym przykładzie widać, że warunki są obiekty c i q (chociaż mogą one być połączone w jeden obiekt, q2). Następnie możesz serializować te obiekty i przechowywać je w bazie danych jako łańcuchy.

--edit--

Jeśli trzeba mieć wszystkie warunki na jednym rekordzie bazy danych, można przechowywać je w słowniku

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

a następnie serializacji słownika.

1

można stworzyć swój własny model do przechowywania zapytań. pierwszy może pole zawiera FK do ContentTypes Drugie pole może być tylko pole tekstowe z zapytaniem itp

A potem można użyć Q object ustawienie queryset dla danego modelu.

+0

Czy chcesz wyjaśnić, w jaki sposób rozwiązuje problem pobierania kryteriów zapytania i przechowywania go w bazie danych, a następnie odzyskiwania go z powrotem m baza danych i jej wykonanie? – cethegeek

4

Możesz przechowywać sql wygenerowany przez zapytanie przy użyciu metody _as_sql() zestawu zapytań. Sposób wykonuje połączenie z bazą danych jako argument, więc chcesz zrobić:

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

W ostatnim Django jest teraz .query(). – Cerin