Yanıtlar:
Bunu yapabilirsin:
Name.objects.exclude(alias__isnull=True)
Boş değerleri ve boş dizeleri hariç tutmanız gerekiyorsa , bunu yapmanın tercih edilen yolu aşağıdaki gibi koşulları birbirine zincirlemektir:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Bu yöntemleri birlikte zincirlemek temel olarak her koşulu bağımsız olarak kontrol eder: yukarıdaki örnekte, aliasboş veya boş bir dize olan satırları hariç tutarız , böylece Nameboş olmayan, boş olmayan bir aliasalana sahip olan tüm nesneleri elde edersiniz . Oluşturulan SQL şöyle görünecektir:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Ayrıca exclude, yalnızca her koşulu karşılayan nesnelerin hariç tutulmasını sağlayan tek bir çağrıya birden fazla argüman iletebilirsiniz :
Name.objects.exclude(some_field=True, other_field=True)
Burada, some_field ve other_field doğru olan satırlar hariç tutulur, böylece her iki alanın doğru olmadığı tüm satırları alırız. Oluşturulan SQL kodu şöyle görünecektir:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Alternatif olarak, mantığınız bundan daha karmaşıksa, Django'nun Q nesnelerini kullanabilirsiniz :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Daha fazla bilgi için bu sayfaya ve Django belgelerindeki bu sayfaya bakın.
Bir kenara: SQL örneklerim sadece bir benzetmedir - gerçekte oluşturulan SQL kodu muhtemelen farklı görünecektir. Gerçekte oluşturdukları SQL'e bakarak Django sorgularının nasıl çalıştığını daha iyi anlayacaksınız.
ORkoşulları kaynaştırmak için bir kullanacağının garanti edildiği anlamına gelmiyordu . Açıklığa kavuşturmak için cevabımı düzenleyeceğim.
NOT (A AND B)eşdeğerdir NOT A OR NOT B. Sanırım bu, SQL bilen ancak ORM'lere aşina olmayan yeni Django geliştiricileri için kafa karıştırıcı hale geliyor.
ANDilk sorguyu kullanmak için bir avantaj haline getirdiği ORiçin işe yarar exclude. Genel durumda, zincirlemeyi bir THENyani, yani düşünmek daha doğru olur exclude(A) THEN exclude(B). Yukarıdaki sert dil için üzgünüm. Cevabınız gerçekten iyi, ama yeni geliştiricilerin genel olarak cevabınızı almasından endişe ediyorum.
ANDve ORbir SQL arka plandan Django gelen birisi için yararlı olabilir. Django hakkında daha derin bir anlayış için, belgelerin benden daha iyi bir iş çıkardığını düşünüyorum.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=Falsedurumun fazla olduğunu düşünüyorum . Eğer alan Nullkesinlikle ise ilk fıkra tarafından hariç tutulur mu?
alias__gtBoş dizeleri JSON gibi hariç tutmak istediğim JSON türü sütunlar için çalışan tek şeydi {'something:''}. Yani çalışma sözdizimi:jsoncolumnname__something__gt=''
İlk olarak, Django belgeleri CharField veya TextField gibi dize tabanlı alanlar için NULL değerlerinin kullanılmamasını önemle tavsiye eder. Açıklama için belgeleri okuyun:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Çözüm: Bence QuerySets'te yöntemleri birbirine bağlayabilirsiniz. Bunu dene:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Bu size aradığınız seti vermelidir.
Django 1.8'den,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Kullanırken sık yapılan hataları önlemek için şunu excludeunutmayın:
Sen olabilir değil eklemek birden içine koşulları bir dışlama () gibi bloğun filter. Birden çok koşulu hariç tutmak için birden çok exclude () kullanmanız gerekir
Misal
Yanlış :
User.objects.filter (email='example@example.com '). Hariç tut (profile__nick_name =' ', profile__avt =' ')
Doğru :
User.objects.filter (email='example@example.com '). (= Profile__nick_name hariç'. ') Hariç (profile__avt =' ')
Bunu basitçe yapabilirsiniz:
Name.objects.exclude(alias="").exclude(alias=None)
Gerçekten bu kadar basit. filter, excludebelirttiği şey dışında her şeyi eşleştirmek için kullanılır . Bu SQL olarak değerlendirir NOT alias='' AND alias IS NOT NULL.
alias="") ve NULL ( alias=None) takma adlarını sorgudan hariç tutmayı amaçlamaktadır . Sizinki ile örnekleri içerir Name(alias=None).
.filter(alias!="")değil, eşdeğer olana cevap veriyordum . Cevabımı düzenledim. Ancak, karakter alanları NULL değerlere izin vermemeli ve değer içermeyen boş dizeyi kullanmalıdır (kurallara göre).
bu, bunu yapmanın başka bir basit yoludur.
Name.objects.exclude(alias=None)
Noneile aynı şey değildir "".
OR(sadece bu durumda), bir SQL üretirAND. Referans için bu sayfaya bakın: docs.djangoproject.com/en/dev/topics/db/queries/… Zincirin avantajı, karmaşık sorgu koşullarını karıştırabilmenizexcludevefiltermodellemenizdir. Gerçek bir SQL modellemek istiyorsanız,ORbir Django Q nesnesi kullanmanız gerekir: docs.djangoproject.com/en/dev/topics/db/queries/… Cevabınız geçerli olduğu için ciddi şekilde yanıltıcı olduğundan lütfen düzenlemenizi düzenleyin .