Django查询未知数量的多个日期范围

2024-04-24 21:58:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表单,允许用户按多个年龄范围选择用户:18-24、25-34、35-44等。当前,如果用户选择多选列表中的前两个字段,查询将返回用户18-34。如果一个用户选择18-24岁和35-44岁,它将包括18-44岁的所有年龄段,而不应该包括25-34岁的用户。在

在用户窗体选择之前,如果不知道需要筛选的范围的数量,如何在查询中包含多个范围过滤器?在

如果你知道用户将要过滤的年龄范围的数量,我知道你可以使用Q链接范围查询

这是我当前的查询:

query = User.objects.filter(
            gender__in=genders,
            created__in=dates,
            data_source__in=sources,
            dob__range=[dob_from, dob_to]
        )

提前谢谢。在


Tags: 用户in过滤器表单列表数量objects链接
1条回答
网友
1楼 · 发布于 2024-04-24 21:58:45

正如您在问题中所说,您可以使用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,
)

如果您不熟悉reduceor_,则可以通过循环列表得到相同的结果:

^{pr2}$

相关问题 更多 >