【问题标题】:Select within select using Django ORM使用 Django ORM 在选择中选择
【发布时间】:2012-10-04 10:59:36
【问题描述】:

我在哪里可以找到有关构建这样的查询的一些信息:

select
  SomeField1,
  (select count(distinct SomeField2) from SomeTable where SomeCondition) as SomeField3
from
  SomeTable2
where
  SomeCondition2

使用 Django ORM?它可能在某处的 Django 文档中,但我找不到它。

【问题讨论】:

    标签: python django select orm


    【解决方案1】:

    你的两张表是什么关系?

    我猜你需要计数,有一个没有检查的代码sn-p,

    SomeModel2.objects.annotate(new_field=Count('SomeField2', 
        distinct=True)).filter(condition=condition,
        another_condition=condition2).values('new_field', 'Somefield1')
    

    请参阅https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotateHow to sort by annotated Count() in a related model in Django 了解更多详情。

    【讨论】:

      【解决方案2】:

      Django 的 ORM 旨在基于每个模型及其关系数据(即 ForeignKey、ManyToManyRelationship...)执行查询。您的示例表明您需要同时来自两个不相关模型的两个结果。 AFAIK,除了单独做之外没有其他办法

      count = SomeTable.objects.filter(SomeCondition).distinct(SomeField2).count()
      somefield1 = SomeTable2.objects.filter(SomeCondition2)
      

      但是,如果您确实需要这样做,有几种方法可以实现,但我不推荐它们:

      Django Queryset across Models?

      Query field across multiple django models

      【讨论】:

        【解决方案3】:

        由于您的问题具体是在哪里您可以找到此信息,请查看Aggregation | Django docs - 它应该可以帮助您实现您在此处尝试的一些内容(具体来说,计数)。

        但是,一起查询不相关的表并不是一件常见的事情。您最好进行单独的查询并将返回的数据手动关联在一起,因为您的数据库无论如何都会拆分该查询。

        在您的情况下,如果您必须运行该查询,我建议您在数据库上使用make raw SQL queries

        【讨论】:

          猜你喜欢
          • 2016-10-02
          • 2018-11-22
          • 2018-10-21
          • 2015-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多