在 Django 中使用 Q 查询外键值

Posted

技术标签:

【中文标题】在 Django 中使用 Q 查询外键值【英文标题】:Querying with foreign key values in Django with Q 【发布时间】:2016-03-31 09:34:09 【问题描述】:

我有一个 Restaurant 模型和一个与 Restaurant 有外键关系的 Schedule 模型。我目前正在尝试查询目前正在营业的餐厅。到目前为止我一直在做

qs = Restaurant.objects.all()
qss = []
for q in qs:
    schedule = q.schedule_set.filter(start_hour__lte=currHour, end_hour__gte=currHour)
    if schedule:
        qss.append(q)

其中 currHour 是 datetime.now() 给出的当前小时。

但我想知道是否可以用 Q 重写此查询,以便如果我必须将此查询与其他查询组合,例如,我可以向 q = Q() 添加更多查询。

【问题讨论】:

【参考方案1】:

当您实际上可以为整个事物编写查询时,您不应该对查询集项目进行此迭代。您现在设置它的方式是为每次迭代发出一个数据库查询。如果我正确理解您的情况,您可以使用 ForeignKey 遍历将其重写为仅发出一个查询:

qss = Restaurant.objects.filter(schedule__start_hour__lte=currHour, schedule__end_hour__gte=currHour)

然后您也可以向它添加查询。 filter() 是可链接的,因此您还可以执行以下操作:

q = Model.objects.filter(**filter_kwargs)
q = q.filter(**additional_filter_kwargs)

【讨论】:

以上是关于在 Django 中使用 Q 查询外键值的主要内容,如果未能解决你的问题,请参考以下文章

django 插入外键值思路

最初在 django 内联表单集中设置不同的外键值

在 django 模板中显示外键值

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

直接在视图Django中设置字段外键值

从 Django values() 获取外键值