คล้ายกับ answerera รุ่นเก่า แต่ค่อนข้างง่ายกว่าโดยไม่มีแลมบ์ดา:
filter_kwargs = {
'field_a': 123,
'field_b__in': (3, 4, 5, ),
}
หากต้องการกรองสองเงื่อนไขนี้โดยใช้OR
:
Item.objects.filter(Q(field_a=123) | Q(field_b__in=(3, 4, 5, ))
เพื่อให้ได้ผลลัพธ์เดียวกันโดยทางโปรแกรม:
list_of_Q = [Q(**{key: val}) for key, val in filter_kwargs.items()]
Item.objects.filter(reduce(operator.or_, list_of_Q))
(แยกออกเป็นสองบรรทัดตรงนี้เพื่อความชัดเจน)
operator
อยู่ในไลบรารีมาตรฐาน: import operator
จาก docstring:
or_ (a, b) - เหมือนกับ a | ข
สำหรับ Python3 reduce
ไม่ได้มีมาให้ภายใน แต่ยังอยู่ในไลบรารีมาตรฐาน:from functools import reduce
PS
อย่าลืมตรวจสอบให้แน่ใจlist_of_Q
ว่าไม่ได้ว่างเปล่า - reduce()
จะสำลักในรายการที่ว่างเปล่ามันต้องการองค์ประกอบอย่างน้อยหนึ่งรายการ
for f in filters: Item.objects.filter(Q(creator=f1) | Q(creator=f2) | ...)