【问题标题】:Is that Django model query correct?那个 Django 模型查询正确吗?
【发布时间】:2017-05-31 15:17:02
【问题描述】:

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

【问题讨论】:

  • 展示你的模型,没有那个很难判断关系的模型。

标签: django model django-queryset


【解决方案1】:

如果您的用例需要,长查询没有任何问题,但是您显示的查询包含许多不必要的内部数据库查询,以确定您希望使用 __in 搜索的内容。您应该可以将其重写为以下内容。

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

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

【讨论】:

  • 是的,它就像一种魅力,我应该更深入地研究文档。再次感谢您。
  • @Baks - 别担心,尽情享受吧!
【解决方案2】:

保留查询通常是一个好主意,以使其易于阅读和维护,并防止数据库引擎过度工作。但是,有时您必须运行复杂的查询,而且您无能为力。

在不了解您的 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 查询时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多