Saya ingin dapat membuat daftar item yang ditambahkan oleh pengguna (terdaftar sebagai pencipta) atau item telah disetujui.
Jadi pada dasarnya saya perlu memilih:
item.creator = owner or item.moderated = False
Bagaimana saya melakukan ini di Django? (lebih disukai dengan filter atau queryset).
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)
reduce(lambda q, f: q | Q(creator=f), filters, Q())
untuk membuat objek Q besar.Item.objects.filter(creator__in=creators)
, misalnya.|
digunakan sebagai operator OR berasal, itu sebenarnya adalah operator serikat pekerja. Ini juga digunakan (bukan di sini) sebagai bitwise ATAU: stackoverflow.com/questions/5988665/pipe-character-in-pythonAnda dapat menggunakan | operator untuk menggabungkan queryset secara langsung tanpa memerlukan objek Q:
(sunting - Saya awalnya tidak yakin apakah ini menyebabkan permintaan tambahan tetapi @spookylukey menunjukkan bahwa evaluasi queryset yang malas menangani hal itu)
sumber
Perlu dicatat bahwa mungkin untuk menambahkan ekspresi Q.
Sebagai contoh:
Ini berakhir dengan permintaan seperti:
Dengan cara ini tidak perlu berurusan dengan atau operator, mengurangi dll.
sumber
query |= Q(email='[email protected]')
?Anda ingin membuat filter dinamis maka Anda harus menggunakan seperti Lambda
reduce(lambda x, y: x | y, [Q(brand=item) for item in brands])
setara dengansumber
from functools import reduce
sebelumnya.operator.or_
bukanlambda x, y: x | y
?Mirip dengan answerera yang lebih tua, tetapi sedikit lebih sederhana, tanpa lambda:
Untuk memfilter kedua kondisi ini menggunakan
OR
:Untuk mendapatkan hasil yang sama secara terprogram:
(Dipecah dalam dua baris di sini, untuk kejelasan)
operator
ada di perpustakaan standar:import operator
Dari docstring:
Untuk Python3,
reduce
bukan builtin lagi tetapi masih di perpustakaan standar:from functools import reduce
PS
Jangan lupa pastikan
list_of_Q
tidak kosong -reduce()
akan tersedak daftar kosong, perlu setidaknya satu elemen.sumber
Ini mungkin berguna https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships
Pada dasarnya itu terdengar seperti mereka bertindak sebagai ATAU
sumber