使用这么长的查询是一个好方法吗? 或者应该以其他方式完成? 这对SQL(postgres)有用吗?
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 :(得分:1)
提供您的用例的长查询没有任何问题,但是您显示的查询包含许多不必要的内部数据库查询,以确定您希望使用__in
搜索的内容。您应该能够将其重写为以下内容。
goodbills = Billinfo.objects.filter(status=20,
lead__link__partner=self.id,
lead__link__landing=eachlanding).count()
这消除了检索链接对象和主要对象的需要(在我看来,它更容易理解)。
答案 1 :(得分: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查询时都不会运行前两个查询。