Dalam model Django QuerySets, saya melihat bahwa ada __gt
dan __lt
untuk nilai komparatif, tetapi apakah ada __ne
/ !=
/ <>
( tidak sama dengan ?)
Saya ingin menyaring menggunakan yang tidak sama:
Contoh:
Model:
bool a;
int x;
saya ingin
results = Model.objects.exclude(a=true, x!=5)
The !=
tidak sintaks yang benar. Aku mencoba __ne
, <>
.
Saya akhirnya menggunakan:
results = Model.objects.exclude(a=true, x__lt=5).exclude(a=true, x__gt=5)
a=true
terlebih dahulu dan kemudian menerapkanx=5
filter pada sisanya. Permintaan yang dimaksud hanya membutuhkan yang dengana=true
danx!=5
. Perbedaannya adalah bahwa semua orang dengana=true
danx=5
juga disaring.Jawaban:
Mungkin objek Q bisa membantu untuk masalah ini. Saya tidak pernah menggunakan mereka tetapi tampaknya mereka dapat dinegasikan dan dikombinasikan seperti ekspresi python normal.
Pembaruan: Saya Baru mencobanya, sepertinya berfungsi cukup baik:
sumber
Kueri Anda tampaknya memiliki negatif ganda, Anda ingin mengecualikan semua baris di mana x tidak 5, jadi dengan kata lain Anda ingin memasukkan semua baris di mana x IS 5. Saya percaya ini akan melakukan trik.
Untuk menjawab pertanyaan spesifik Anda, tidak ada "tidak sama dengan" tetapi itu mungkin karena Django memiliki kedua metode "filter" dan "kecualikan" yang tersedia sehingga Anda selalu dapat dengan mudah mengubah putaran logika untuk mendapatkan hasil yang diinginkan.
sumber
results = Model.objects.filter(a=true).exclude(x=5)
exclude
danfilter
panggilan tidak membuat perbedaan yang berarti. Urutan kondisi dalamWHERE
klausa berubah, tetapi bagaimana masalahnya?yang
field=value
sintaks dalam permintaan adalah singkatan untukfield__exact=value
. Artinya, Django menempatkan operator kueri di bidang kueri di pengidentifikasi . Django mendukung operator berikut:Saya yakin dengan menggabungkan ini dengan objek Q seperti yang disarankan Dave Vogt dan menggunakan
filter()
atauexclude()
seperti yang disarankan Jason Baker, Anda akan mendapatkan apa yang Anda butuhkan untuk pertanyaan apa pun yang mungkin.sumber
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
dan itu berfungsi.icontains
,iexact
dan singkatan yang sama untuk "abaikan sensitivitas huruf". Ini bukan untuk "terbalik".exclude()
dengan beberapa istilah, Anda mungkin ingin membuat proposisi denganOR
operator, misalnyaexclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
untuk mengecualikan hasil dalam kedua kondisi.Sangat mudah untuk membuat pencarian kustom dengan Django 1.7. Ada
__ne
contoh pencarian dalam dokumentasi resmi Django .Anda harus membuat pencarian itu sendiri terlebih dahulu:
Maka Anda perlu mendaftarkannya:
Dan sekarang Anda dapat menggunakan
__ne
pencarian di pertanyaan Anda seperti ini:sumber
Di Django 1.9 / 1.10 ada tiga opsi.
Rantai
exclude
danfilter
Gunakan
Q()
benda dan~
operatorDaftarkan fungsi pencarian kustom
The
register_lookup
dekorator ditambahkan pada Django 1,8 dan memungkinkan kustom lookup seperti biasa:sumber
Sementara dengan Model, Anda dapat menyaring dengan
=
,__gt
,__gte
,__lt
,__lte
, Anda tidak dapat menggunakanne
,!=
atau<>
. Namun, Anda dapat mencapai pemfilteran yang lebih baik dalam menggunakan objek Q.Anda dapat menghindari rantai
QuerySet.filter()
danQuerySet.exlude()
, dan gunakan ini:sumber
Keputusan desain yang tertunda. Sementara itu, gunakan
exclude()
Pelacak masalah Django memiliki entri luar biasa # 5763 , berjudul "Queryset tidak memiliki operator filter" tidak sama "" . Ini luar biasa karena (per April 2016) "dibuka 9 tahun yang lalu" (di zaman batu Django), "ditutup 4 tahun lalu", dan "terakhir diubah 5 bulan yang lalu".
Bacalah diskusi, itu menarik. Pada dasarnya, beberapa orang berdebat
__ne
harus ditambahkan sementara yang lain mengatakanexclude()
lebih jelas dan karenanya__ne
harus tidak ditambahkan.(Saya setuju dengan yang pertama, karena argumen terakhir kira-kira sama dengan mengatakan Python seharusnya tidak ada
!=
karena sudah==
dannot
sudah ...)sumber
Menggunakan kecualikan dan filter
sumber
Anda harus menggunakan
filter
danexclude
menyukai inisumber
Bit kode terakhir akan mengecualikan semua objek di mana x! = 5 dan a adalah Benar. Coba ini:
Ingat, tanda = pada baris di atas memberikan False ke parameter a dan angka 5 ke parameter x. Itu tidak memeriksa kesetaraan. Jadi, sebenarnya tidak ada cara untuk menggunakan simbol! = Dalam panggilan kueri.
sumber
results = Model.objects.filter(a__in=[False,None],x=5)
sumber
Django-model-values (pengungkapan: penulis) menyediakan implementasi pencarian NotEqual , seperti dalam jawaban ini . Ini juga menyediakan dukungan sintaksis untuk itu:
sumber
Apa yang Anda cari adalah semua objek yang memiliki
a=false
ataux=5
. Di Django,|
berfungsi sebagaiOR
operator antara kueri:sumber
Ini akan memberikan hasil yang Anda inginkan.
karena tidak sama Anda dapat menggunakan
~
kueri yang sama. jelas,Q
dapat digunakan untuk mencapai kueri yang sama.sumber
Q(a=True) and ~Q(x=5)
akan mengevaluasi~Q(x=5)
sebagai argumen untuk.exclude
. Silakan baca: docs.python.org/3/reference/expressions.html#boolean-operations dan docs.python.org/3/reference/… .Waspadai banyak jawaban yang salah untuk pertanyaan ini!
Logika Gerard benar, meskipun itu akan mengembalikan daftar daripada queryset (yang mungkin tidak masalah).
Jika Anda membutuhkan queryset, gunakan Q:
sumber