正如您在问题中所说的,您可以使用Q()
对象并将它们组合在一起。您不知道Q()
会有多少个对象,这不是问题。生成Q()对象的列表,然后将列表缩小为单个Q()
。
from operator import or_
# import for Python 3, not required in Python 2
from functools import reduce
ranges = [(18,24), (35, 44)] # hardcoded as an example, you can dynamically generate this
qs = [Q(dob_range=[dob_from_, dob_to]) for (dob_from_, dob_to) in ranges]
# combine the qs
dob_q = reduce(or_, qs, Q())
query = User.objects.filter(
dob_q,
gender__in=genders,
created__in=dates,
data_source__in=sources,
)
如果您不熟悉reduce
和or_
,则可以通过遍历列表来获得相同的结果:
qs = [Q(dob_range=[dob_from_, dob_to]) for (dob_from_, dob_to) in ranges]
dob_q = Q()
for q in qs:
dob_q = dob_q | q