2013-05-03 29 views
22

tôi phải lọc một queryset bởi một giá trị năng động (có thể None): Tôi có thể chỉ đơn giản viết:Django: lọc truy vấn bằng 'field__isnull = True' hoặc 'field = None'?

filtered_queryset = queryset.filter(field=value) 

hoặc tôi sẽ kiểm tra None:

if value is None: 
    filtered_queryset = queryset.filter(field__isnull=True) 
else: 
    filtered_queryset = queryset.filter(field=value) 

Liệu hành vi phụ thuộc vào DBMS cụ thể?

Trả lời

27

ORM sẽ xử lý None (truyền nó thành NULL) cho bạn và trả về đối tượng QuerySet, vì vậy trừ khi bạn cần bắt đầu None, ví dụ đầu tiên là tốt.

>>> User.objects.filter(username=None) 
[] 
>>> type(_) 
<class 'django.db.models.query.QuerySet'> 
>>> print User.objects.filter(username=None).query 
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" IS NULL 
+1

+1 Tôi đã không biết nó xử lý' Không có' như thế, rất hữu ích để biết. – Ngenator

+3

Tôi đang sử dụng Django 1.7 và cả hai trường hợp tạo cùng một truy vấn: Trong [19]: str (User.objects.filter (username__isnull = True) .query) == str (User.objects.filter (tên người dùng = Không có) .query) Out [19]: True Vì vậy, tôi cho rằng bạn cũng có thể sử dụng. – Akhorus

5

Tôi thích giải pháp thứ hai mà được xử lý tốt hơn

Update

if value is None: 
    filtered_queryset = queryset.filter(field__isnull=True) 
    //Do some proessing with filtered_queryset object with None values 
else: 
    filtered_queryset = queryset.filter(field=value) 
    //Do some proessing with filtered_queryset object with not NULL values 

Query bộ có thể xử lý Null values..Based trên User.objects.filter(username=None) này này sẽ lấy giá trị chỉ nơi tên người dùng = NULL

+0

Vấn đề là tôi có một số giá trị để xử lý như thế ... – Don

+0

Lý do duy nhất mà đề nghị điều kiện thứ hai của bạn là nếu u muốn để xử lý Không điều kiện và thực hiện một số chế biến trên nó sau đó u có thể đã sử dụng giải pháp thứ hai.Vui lòng xem câu trả lời được cập nhật .. – Rajeev

+0

Cảm ơn. Một câu hỏi cuối cùng: khi bạn nói "điều này sẽ lấy giá trị chỉ nơi username = NULL", bạn có nghĩa là Django sẽ dịch thành "tên người dùng IS NULL" trong trường hợp nó được yêu cầu bởi các phụ trợ DB? – Don