2009-03-23 47 views
6

Có, ở Django, một cách tiêu chuẩn để viết các bộ lọc phức tạp, tùy chỉnh cho QuerySets?Bộ lọc truy vấn tùy chỉnh Django

Cũng giống như tôi có thể viết

MyClass.objects.all().filter(field=val) 

Tôi muốn làm điều gì đó như thế này:

MyClass.objects.all().filter(customFilter) 

tôi có thể sử dụng một biểu phát

(x for x in MyClass.objects.all() if customFilter(x)) 

nhưng điều đó sẽ mất tính linh hoạt và các chức năng khác mà QuerySets cung cấp.

Trả lời

5

Tôi nghĩ bạn có thể cần tùy chỉnh managers.

+0

Tôi đoán tôi cần điều này. Nhưng nó trông rất phức tạp so với chỉ có thể vượt qua một chức năng lọc trong khi đang bay. – interstar

+0

Nó không phải là rất phức tạp, và nó là một thực hành tốt để làm cho quản lý tùy chỉnh, đặc biệt là nếu bạn có kế hoạch trên bộ nhớ đệm công cụ từ db vv – Vasil

13

Đề xuất để bắt đầu sử dụng các phương pháp của người quản lý là một cách tốt nhất, nhưng để trả lời câu hỏi của bạn trực tiếp hơn: có, hãy sử dụng Q objects. Ví dụ:

from django.db.models import Q 

complexQuery = Q(name__startswith='Xa') | ~Q(birthdate__year=2000) 

MyModel.objects.filter(complexQuery) 

Các đối tượng Q có thể được kết hợp với | (HOẶC), & (VÀ) và ~ (NOT).

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