2010-06-14 20 views
13

Tôi muốn lưu tiêu chí truy vấn vào DB để sử dụng lại.Làm cách nào để lấy và/hoặc lưu tiêu chí truy vấn vào DB?

Vì vậy, nếu tôi có một queryset như:

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. 

Tôi muốn lưu vào DB không phải là kết quả của queryset (tức là các hồ sơ khách hàng cá nhân mà có một kết hợp lĩnh vực nhà nước 'AL') ; nhưng chính queryset (tức là các tiêu chí được sử dụng trong việc lọc mô hình Client).

Mục tiêu cuối cùng là có một "bộ lọc đã lưu" có thể đọc từ DB và được sử dụng bởi nhiều ứng dụng django.

Lúc đầu, tôi nghĩ tôi có thể tuần tự hóa bộ truy vấn và lưu lại. Nhưng việc tuần tự hóa một queryset thực sự thực hiện truy vấn - và sau đó tôi kết thúc với một danh sách tĩnh các máy khách ở Alabama tại thời điểm serialization. Tôi muốn danh sách được năng động (tức là mỗi lần tôi đọc queryset từ DB nó sẽ thực hiện và lấy danh sách khách hàng mới nhất ở Alabama).


Chỉnh sửa: Ngoài ra, bạn có thể lấy danh sách bộ lọc được áp dụng cho bộ truy vấn không?

Cái gì như:

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

{ 'state': 'AL' } 

Trả lời

14

Bạn có thể làm như jcd nói, lưu trữ sql.

Bạn cũng có thể lưu trữ các điều kiện.

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

Trong đó ví dụ bạn thấy rằng các điều kiện là các đối tượng cq (mặc dù chúng có thể được tham gia vào một đối tượng, q2). Sau đó bạn có thể tuần tự hóa các đối tượng này và lưu trữ chúng trên cơ sở dữ liệu dưới dạng chuỗi.

--edit--

Nếu bạn cần phải có đủ các điều kiện về cơ sở dữ liệu một kỷ lục duy nhất, bạn có thể lưu trữ chúng trong một cuốn từ điển

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

và sau đó serialize từ điển.

1

bạn có thể tạo mô hình riêng của bạn để lưu trữ các truy vấn của bạn. Đầu tiên lĩnh vực có thể chứa fk để ContentTypes lĩnh vực thứ hai có thể chỉ lĩnh vực văn bản với truy vấn của bạn, vv

Và sau đó bạn có thể sử dụng để thiết lập Q object queryset cho mô hình của bạn.

+0

Bạn có muốn xây dựng cách giải quyết vấn đề nhận tiêu chí truy vấn và lưu trữ nó trong cơ sở dữ liệu và sau đó khôi phục nó không m cơ sở dữ liệu và thực hiện nó? – cethegeek

4

Bạn có thể lưu sql được tạo bởi truy vấn bằng phương thức _as_sql() của truy vấn. Phương pháp này lấy kết nối cơ sở dữ liệu làm đối số, vì vậy bạn sẽ làm:

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

Trong Django gần đây, bây giờ là .query(). – Cerin

Các vấn đề liên quan