Django模型查询是否正确?

时间:2017-01-16 17:51:33

标签: django model django-queryset

使用这么长的查询是一个好方法吗? 或者应该以其他方式完成? 这对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()

2 个答案:

答案 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查询时都不会运行前两个查询。