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 时避免连接?的主要内容,如果未能解决你的问题,请参考以下文章

django 插入外键值思路

如何避免Kotlin暴露的N + 1查询问题。 (通过DAO的Reference.id.value字段获取值时)

Django:扩展用户模型避免数据库连接

Django外键不适用于一对多关系

是否可以避免 OneToOne 关系中的代理主键并重用外键作为 id?

缓慢的 MySQL 查询:有没有办法避免对左连接的每一行进行条件选择计数?