Django - 查询外键 ID 时避免连接?
Posted
技术标签:
【中文标题】Django - 查询外键 ID 时避免连接?【英文标题】:Django - Avoiding joins when querying foreign key ids? 【发布时间】:2012-02-02 05:12:32 【问题描述】:假设我在 Django 中有一个简单的博客条目模型:
class Entry(models.Model):
author = models.ForeignKey(Author)
topic = models.ForeignKey(Topic)
entry = models.CharField(max_length=50, default='')
现在假设我要查询作者或主题,但完全排除特定主题。
entry_list = Entry.objects.filter(Q(author=12)|Q(topic=123)).exclude(topic=666)
很简单,但我发现这个原始 SQL 包含一个主题表的连接,即使它不是必须使用的:
SELECT `blog_entry`.`id`
FROM `blog_entry`
LEFT OUTER JOIN `blog_topic`
ON (`blog_entry`.`topic_id` = `blog_topic`.`id`)
WHERE ((`blog_entry`.`author_id` = 12
OR `blog_entry`.`topic_id` = 123
)
AND NOT ((`blog_topic`.`id` = 666
AND NOT (`blog_topic`.`id` IS NULL)
AND `blog_topic`.`id` IS NOT NULL
))
)
这是为什么呢?如何让 Django 只查询列 ID 而不是连接表?我尝试了以下方法,但它给出了 FieldError:
entry_list = Entry.objects.filter(Q(author_id=12)|Q(topic_id=123)).exclude(topic_id=666)
【问题讨论】:
【参考方案1】:我想知道这是否是一个错误。
尝试一个类似的例子,将exclude
放在filter
之前时我没有加入(但我确实使用您的订单得到它)
【讨论】:
同意,我得到和你一样的东西,有什么办法可以强制它只使用 column_id?以上是关于Django - 查询外键 ID 时避免连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何避免Kotlin暴露的N + 1查询问题。 (通过DAO的Reference.id.value字段获取值时)