Mirip dengan answerera yang lebih tua, tetapi sedikit lebih sederhana, tanpa lambda:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
Untuk memfilter kedua kondisi ini menggunakan OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
Untuk mendapatkan hasil yang sama secara terprogram:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(Dipecah dalam dua baris di sini, untuk kejelasan)
operator
ada di perpustakaan standar: import operator
Dari docstring:
or_ (a, b) - Sama dengan | b.
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.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)