【发布时间】:2015-08-19 09:22:09
【问题描述】:
我正在使用 Django 1.8。
我有一个需要逻辑“或”和“与”的查询集。 它给出了:
MyModel.objects.filter(
Q(start__gt=today) | Q(end__lte=today),
active=True).update(active=False)
正如您可能理解的那样,它应该获取每个不应该已经启动的活动 MyModel 实例,以及已经完成的实例,并停用它们。
“start”和“end”是日期字段,“active”是布尔值。
它有效,但它生成的查询远未优化。我希望能够通过过滤“活动”状态来启动查询,然后检查其他两个字段,因为在我的数据库中,我有数千个条目,但只有少数条目具有 active=True。我会说这个布尔测试比比较更快。
我无法重新排序参数,因为带有两个 Q() 的前者是定位参数,而后者是名称参数,并且我不能链接多个 filter(),因为它会生成“或”,而不是“和”。
有没有办法做到这一点?
【问题讨论】:
-
添加适当的索引有什么问题?
-
我不明白你在问什么(或者因为我对 Django 很陌生,或者因为我不是以英语为母语的人)
-
这不是 Django 的东西,而是数据库的东西。
-
我认为在这种情况下使用索引是一件好事,因为它加速了执行,但我认为它不会改变查询的执行方式。我已经在这个字段上有一个索引。
标签: sql django django-queryset django-q