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, alias
boş veya boş bir dize olan satırları hariç tutarız , böylece Name
boş olmayan, boş olmayan bir alias
alana 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.
OR
koş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.
AND
ilk sorguyu kullanmak için bir avantaj haline getirdiği OR
için işe yarar exclude
. Genel durumda, zincirlemeyi bir THEN
yani, 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.
AND
ve OR
bir 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=False
durumun fazla olduğunu düşünüyorum . Eğer alan Null
kesinlikle ise ilk fıkra tarafından hariç tutulur mu?
alias__gt
Boş 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 exclude
unutmayı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
, exclude
belirttiğ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)
None
ile 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ırabilmenizexclude
vefilter
modellemenizdir. Gerçek bir SQL modellemek istiyorsanız,OR
bir 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 .