正如您在问题中所说的,您可以使用
Q()对象并将它们组合在一起。您不知道
Q()会有多少个对象,这不是问题。生成Q()对象的列表,然后将列表缩小为单个
Q()。
from operator import or_# import for Python 3, not required in Python 2from functools import reduceranges = [(18,24), (35, 44)] # hardpred as an example, you can dynamically generate thisqs = [Q(dob_range=[dob_from_, dob_to]) for (dob_from_, dob_to) in ranges]# combine the qsdob_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



