我的模型是这样的:
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篇文章。如何使此查询更快?
答案 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的错误。