Câu trả lời:
Bạn có thể làm điều này:
Name.objects.exclude(alias__isnull=True)
Nếu bạn cần loại trừ các giá trị null và chuỗi rỗng, cách ưa thích để làm như vậy là xâu chuỗi các điều kiện như sau:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Xâu chuỗi các phương thức này với nhau về cơ bản kiểm tra từng điều kiện một cách độc lập: trong ví dụ trên, chúng tôi loại trừ các hàng alias
có giá trị null hoặc chuỗi rỗng, do đó bạn nhận được tất cả Name
các đối tượng có trường không rỗng, không trống alias
. SQL được tạo sẽ trông giống như:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Bạn cũng có thể chuyển nhiều đối số cho một cuộc gọi đến exclude
, điều này sẽ đảm bảo rằng chỉ các đối tượng đáp ứng mọi điều kiện bị loại trừ:
Name.objects.exclude(some_field=True, other_field=True)
Ở đây, các hàng trong đó some_field
và other_field
đúng được loại trừ, vì vậy chúng tôi nhận được tất cả các hàng trong đó cả hai trường đều không đúng. Mã SQL được tạo sẽ trông giống như thế này:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Ngoài ra, nếu logic của bạn phức tạp hơn thế, bạn có thể sử dụng các đối tượng Q của Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Để biết thêm thông tin xem trang này và trang này trong tài liệu Django.
Bên cạnh: Các ví dụ SQL của tôi chỉ là một sự tương tự - mã SQL được tạo thực tế có thể sẽ trông khác nhau. Bạn sẽ hiểu sâu hơn về cách các truy vấn Django hoạt động bằng cách thực sự nhìn vào SQL mà chúng tạo ra.
OR
để hợp nhất các điều kiện. Tôi sẽ chỉnh sửa câu trả lời của tôi để làm rõ.
NOT (A AND B)
tương đương với NOT A OR NOT B
. Tôi nghĩ rằng điều đó làm cho mọi thứ trở nên khó hiểu đối với các nhà phát triển Django mới biết SQL nhưng không quen thuộc với ORM.
AND
truy vấn đầu tiên thành OR
vì bạn đang sử dụng exclude
. Trong trường hợp chung, có lẽ đúng hơn khi nghĩ về chuỗi như một THEN
, tức là exclude(A) THEN exclude(B)
. Xin lỗi về ngôn ngữ khắc nghiệt ở trên. Câu trả lời của bạn thực sự tốt, nhưng tôi lo lắng về việc các nhà phát triển mới nhận câu trả lời của bạn quá chung chung.
AND
và OR
có thể hữu ích cho ai đó đến Django từ nền tảng SQL. Để hiểu sâu hơn về Django, tôi nghĩ rằng các tài liệu làm một công việc tốt hơn tôi có thể.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
điều kiện là dư thừa. Nếu lĩnh vực Null
chắc chắn nó sẽ bị loại trừ bởi mệnh đề đầu tiên?
alias__gt
là điều duy nhất hoạt động cho các cột kiểu JSON nơi tôi muốn loại trừ các chuỗi rỗng khỏi JSON như thế nào {'something:''}
. Vì vậy, cú pháp làm việc là:jsoncolumnname__something__gt=''
Đầu tiên, các tài liệu Django khuyên bạn không nên sử dụng các giá trị NULL cho các trường dựa trên chuỗi như CharField hoặc TextField. Đọc tài liệu để được giải thích:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Giải pháp: Tôi cũng có thể xâu chuỗi các phương thức lại với nhau trên QuerySets. Thử cái này:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Điều đó sẽ cung cấp cho bạn các thiết lập bạn đang tìm kiếm.
Từ Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Để tránh những lỗi phổ biến khi sử dụng exclude
, hãy nhớ:
Bạn không thể thêm nhiều điều kiện vào một khối loại trừ () như thế nào filter
. Để loại trừ nhiều điều kiện, bạn phải sử dụng nhiều loại trừ ()
Thí dụ
Không chính xác :
User.objects.filter (email='example@example.com '). Loại trừ (profile__nick_name =' ', profile__avt =' ')
Đúng :
User.objects.filter (email='example@example.com '). Loại trừ (profile__nick_name =' '). Loại trừ (profile__avt =' ')
Bạn chỉ có thể làm điều này:
Name.objects.exclude(alias="").exclude(alias=None)
Nó thực sự chỉ đơn giản như vậy. filter
được sử dụng để khớp và exclude
phù hợp với mọi thứ nhưng những gì nó chỉ định. Điều này sẽ đánh giá thành SQL như NOT alias='' AND alias IS NOT NULL
.
alias=""
) và NULL ( alias=None
) khỏi truy vấn. Bạn sẽ bao gồm các trường hợp với Name(alias=None)
.
.filter(alias!="")
nhưng không phải tiêu đề. Tôi đã chỉnh sửa câu trả lời của mình. Tuy nhiên, các trường ký tự không nên cho phép các giá trị NULL và sử dụng chuỗi trống cho một giá trị không (theo quy ước).
đây là một cách đơn giản để làm điều đó
Name.objects.exclude(alias=None)
None
không phải là điều tương tự như ""
.
OR
(chỉ trong trường hợp này), nó tạo ra SQLAND
. Xem trang này để tham khảo: docs.djangoproject.com/en/dev/topics/db/queries/ Khăn Ưu điểm của chuỗi là bạn có thể trộnexclude
vàfilter
mô hình hóa các điều kiện truy vấn phức tạp. Nếu bạn muốn mô hình hóa một SQL thực,OR
bạn phải sử dụng một đối tượng Django Q: docs.djangoproject.com/en/dev/topics/db/queries/, Vui lòng chỉnh sửa chỉnh sửa của bạn để phản ánh điều này, vì câu trả lời bị sai lệch nghiêm trọng .