Tương tự như answerera cũ, nhưng đơn giản hơn một chút, không có lambda:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
Để lọc hai điều kiện này bằng cách sử dụng OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
Để có được kết quả tương tự theo chương trình:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(chia thành hai dòng ở đây, cho rõ ràng)
operator
nằm trong thư viện chuẩn: import operator
Từ doc Chuỗi:
or_ (a, b) - Giống như a | b.
Đối với Python3, reduce
không còn là phần dựng sẵn nữa mà vẫn nằm trong thư viện chuẩn:from functools import reduce
PS
Đừng quên đảm bảo list_of_Q
không trống - reduce()
sẽ bị nghẹt trong danh sách trống, nó cần ít nhất một yếu tố.
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)