假设我在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)
答案 0 :(得分:2)
我想知道这是不是一个错误。
尝试一个类似的例子,我在exclude
之前放filter
时没有加入(但我确实使用你的订单)