Django - 在查询外键ID时避免连接?

时间:2012-01-04 09:24:48

标签: mysql sql django django-queryset

假设我在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 个答案:

答案 0 :(得分:2)

我想知道这是不是一个错误。

尝试一个类似的例子,我在exclude之前放filter时没有加入(但我确实使用你的订单)