Anda bisa melakukan ini:
Name.objects.exclude(alias__isnull=True)
Jika Anda perlu mengecualikan nilai nol dan string kosong, cara yang disukai untuk melakukannya adalah dengan menyatukan kondisi seperti:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Merangkai metode ini bersama-sama pada dasarnya memeriksa setiap kondisi secara independen: dalam contoh di atas, kami mengecualikan baris di mana alias
null atau string kosong, sehingga Anda mendapatkan semua Name
objek yang memiliki bidang tidak-nol, tidak-kosong alias
. SQL yang dihasilkan akan terlihat seperti:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Anda juga dapat meneruskan beberapa argumen ke satu panggilan exclude
, yang akan memastikan bahwa hanya objek yang memenuhi setiap kondisi yang dikecualikan:
Name.objects.exclude(some_field=True, other_field=True)
Di sini, baris di mana some_field
dan other_field
benar dikecualikan, jadi kami mendapatkan semua baris di mana kedua bidang tidak benar. Kode SQL yang dihasilkan akan terlihat sedikit seperti ini:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Atau, jika logika Anda lebih kompleks dari itu, Anda bisa menggunakan objek Q Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Untuk info lebih lanjut lihat halaman ini dan halaman ini dalam dokumen Django.
Sebagai tambahan: Contoh SQL saya hanya analogi - kode SQL yang dihasilkan mungkin akan terlihat berbeda. Anda akan mendapatkan pemahaman yang lebih dalam tentang bagaimana pertanyaan Django bekerja dengan benar-benar melihat SQL yang mereka hasilkan.
OR
(hanya dalam kasus ini), itu menghasilkan SQLAND
. Lihat halaman ini untuk referensi: docs.djangoproject.com/en/dev/topics/db/queries/... Keuntungan dari chaining adalah Anda dapat mencampurexclude
danfilter
memodelkan kondisi kueri yang rumit. Jika Anda ingin memodelkan SQL nyata,OR
Anda harus menggunakan objek Django Q: docs.djangoproject.com/en/dev/topics/db/queries/... Harap edit hasil edit Anda untuk mencerminkan hal ini, karena jawabannya sangat menyesatkan seperti apa adanya. .OR
untuk memadukan kondisi. Saya akan mengedit jawaban saya untuk menjelaskan.NOT (A AND B)
setara denganNOT A OR NOT B
. Saya pikir itu membuat hal-hal membingungkan bagi pengembang Django baru yang tahu SQL tetapi tidak terbiasa dengan ORM.AND
kueri pertama menjadiOR
karena Anda gunakanexclude
. Dalam kasus umum, mungkin lebih tepat untuk menganggap chaining sebagaiTHEN
, yaituexclude(A) THEN exclude(B)
. Maaf tentang bahasa kasar di atas. Jawaban Anda benar-benar bagus, tetapi saya khawatir pengembang baru mengambil jawaban Anda terlalu umum.AND
danOR
mungkin berguna bagi seseorang yang datang ke Django dari latar belakang SQL. Untuk pemahaman yang lebih mendalam tentang Django, saya pikir para dokter melakukan pekerjaan yang lebih baik daripada yang saya bisa.sumber
alias__isnull=False
kondisinya berlebihan. Jika bidang ituNull
pasti akan dikeluarkan oleh klausa pertama?alias__gt
adalah satu-satunya hal yang berfungsi untuk kolom tipe JSON di mana saya ingin mengecualikan string kosong dari JSON seperti{'something:''}
. Jadi sintaks yang berfungsi adalah:jsoncolumnname__something__gt=''
Pertama, dokumen Django sangat merekomendasikan untuk tidak menggunakan nilai NULL untuk bidang berbasis string seperti CharField atau TextField. Baca dokumentasi untuk penjelasan:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Solusi: Anda juga dapat menyatukan metode di QuerySets, saya pikir. Coba ini:
Itu akan memberi Anda set yang Anda cari.
sumber
Dari Django 1.8,
sumber
Untuk menghindari kesalahan umum saat menggunakan
exclude
, ingat:Anda tidak dapat menambahkan beberapa kondisi ke dalam blokir exclude ()
filter
. Untuk mengecualikan beberapa kondisi, Anda harus menggunakan beberapa mengecualikan ()Contoh
sumber
Anda cukup melakukan ini:
Benar-benar sesederhana itu.
filter
digunakan untuk mencocokkan danexclude
mencocokkan segalanya kecuali apa yang ditentukan. Ini akan mengevaluasi ke dalam SQL sebagaiNOT alias='' AND alias IS NOT NULL
.sumber
alias=""
) dan NULL (alias=None
) dari kueri. Anda akan menyertakan contoh denganName(alias=None)
..filter(alias!="")
tapi bukan judulnya. Saya sudah mengedit jawaban saya. Namun, bidang karakter tidak boleh mengizinkan nilai NULL dan menggunakan string kosong untuk nilai yang tidak (sesuai dengan konvensi).ini cara mudah lain untuk melakukannya.
sumber
None
tidak sama dengan""
.