Django模型查询是否正确?
问题描述:
正在使用这种长查询的一个好方法? 还是应该以其他方式完成? 这对SQL(postgres)有好处吗?Django模型查询是否正确?
goodbills = Billinfo.objects.filter(
status=20,
lead_id__in=Lead.objects.filter(
link_id__in=Link.objects.filter(
partner=self.id,
landing=eachlanding
).values_list('id')
).values_list('id')
).count()
答
Theres没有提供您的用例的长查询错误需要它,但是您的查询显示包含大量不必要的内部数据库查询来找出你想用__in
搜索什么。您应该可以将其重写为以下内容。
goodbills = Billinfo.objects.filter(status=20,
lead__link__partner=self.id,
lead__link__landing=eachlanding).count()
这消除了检索链接对象和引导对象(并在我看来更容易理解)的需要。
答
为了使它们易于阅读和维护以及防止数据库引擎工作太辛苦,保留查询通常是个好主意。但是,有时您必须运行复杂的查询,而且您可以执行的操作并不多。
不知道您的ERD(实体关系图),很难评论如何更好地构建该查询。但最起码,我会做这样的事情:
link_ids = Link.objects.filter(partner=self.id, landing=eachlanding)
lead_id = Lead.objects.filter(link_id__in=link_ids).values_list('id')).values_list('id')
goodbills = Billinfo.objects.filter(status=20, lead_id__in=lead_ids)
这将确保前两个查询不运行的每个调用goodbills查询时间。
显示您的模型没有,很难判断关系btw模型。 – shuboy2014