2010-06-14 23 views
13

我想將查詢集條件保存到數據庫以供重用。如何獲取和/或將查詢集條件保存到數據庫?

所以,如果我有這樣一個查詢集:

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' } 

回答

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

在你看到,條件是對象實例cq(儘管它們可以在一個對象被接合,q2)。然後可以序列化這些對象並將它們作爲字符串存儲在數據庫中。

- 編輯 -

如果你需要有一個單一的數據庫記錄的所有條件,你可以將它們存儲在一個字典

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

,然後序列化的字典。

1

,你可以創建自己的模型來存儲您的查詢。 第一場可以包含FK到ContentTypes 第二個字段可以只是文本字段查詢等

之後,你可以使用Q object設置查詢集的模型。

+0

您想詳細說明如何解決獲取查詢集條件並將其存儲在數據庫中然後從中恢復它的問題數據庫並執行它? – cethegeek 2010-06-14 23:19:25

4

您可以使用查詢集的_as_sql()方法存儲查詢生成的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

在最近的Django中,它現在是.query()。 – Cerin 2012-11-28 16:02:50

相關問題