Django的“检查OneToOneField是否为None”的查询速度较低

时间:2018-09-02 13:34:06

标签: django django-models

我的模型是这样的:

class ArticleText(models.Model):
    article = models.OneToOneField(Article, on_delete=models.CASCADE, related_name="article_text")
    text = models.TextField()
    indexed_by_es = models.BooleanField(default=False, db_index=True)
    indexed_by_solr = models.BooleanField(default=False, db_index=True)

Article是原始模型,我想使用ArticleText对其进行扩展。

耗时的代码是这样的:

articles = Article.objects.filter(Q(article_text=None))[0:10]

我的数据库中大约有10,000篇文章。如何使此查询更快?

1 个答案:

答案 0 :(得分:0)

已更新

感谢@Sachin Kukreja。

使用articles = Article.objects.filter(article_text=None).values('id')[0:10]可以防止原始SQL选择太多无用的字段。它可以完成我以前的回答,但是很简洁。


上一个答案

感谢@Willem Van Onsem的评论,我注意到了这个问题的来源:Django生成的查询选择了太多无用的字段。所以我自己建立了一个原始查询:

articles = Article.objects.raw(''' select a.id from main_article as a left outer join external_data_access_articletext as b on a.id = b.article_id where (b.id is null) or (b.indexed_by_es = false) limit 10''')

更快。认为这可能是Django的错误。