2017-01-16 82 views
0

正在使用这种长查询的一个好方法? 还是应该以其他方式完成? 这对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() 
+0

显示您的模型没有,很难判断关系btw模型。 – shuboy2014

回答

1

Theres没有提供您的用例的长查询错误需要它,但是您的查询显示包含大量不必要的内部数据库查询来找出你想用__in搜索什么。您应该可以将其重写为以下内容。

goodbills = Billinfo.objects.filter(status=20, 
            lead__link__partner=self.id, 
            lead__link__landing=eachlanding).count() 

这消除了检索链接对象和引导对象(并在我看来更容易理解)的需要。

+1

是的,它的工作就像一个魅力,我应该深入了解它似乎的文档。再次感谢你。 – Baks

+0

@Baks - 不用担心,尽情享受吧! – Sayse

0

为了使它们易于阅读和维护以及防止数据库引擎工作太辛苦,保留查询通常是个好主意。但是,有时您必须运行复杂的查询,而且您可以执行的操作并不多。

不知道您的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查询时间。