【问题标题】:Django Queryset compare two different models with multiple rowsDjango Queryset 将两个不同的模型与多行进行比较
【发布时间】:2017-04-02 18:34:16
【问题描述】:

我想要返回这两个模型的总和。我收到有关返回多行的子查询的数据库错误。在不使用 for 语句的情况下比较两者的最佳方法是什么?

AuthorizationT(models.Model)
  ar_id = models.BigIntegerField(blank=True, null=True)
  status_flag = models.BigIntegerField(blank=True, null=True)
BillT(models.Model)
  paid_id = models.BigIntegerField(blank=True, null=True)
  recvd = models.FloatField(blank=True, null=True)

我试过的查询

paidbill= BillT.objects.values_list('paid_id', flat=true)
AuthorizationT.objects.values().filter(ar_id=paidbill, status_flag=0).aggregate(Sum('recvd'))

在 SQL 中我知道它会是

select sum(recvd) from authorization_t a, bill_t b where a.ar_billid0= b.paid_id and a.status_flag=0

我正在查询集中寻找等价物

【问题讨论】:

    标签: python sql django django-queryset


    【解决方案1】:

    我认为如果没有for loop,您将无法实现这一目标,因为我认为您需要加入这些表,因为两个表都有过滤,并且您想对第一个表中的一个字段求​​和。连接表的方法是prefetch_related()select_related(),但它们使用外键。

    这让我建议id fields: bill_id and ar_id 应该被规范化,因为看起来会有数据重复。使用关系也会使查询变得更简单。

    【讨论】:

      【解决方案2】:

      由于paidbill 是一个列表,您必须在查询中使用__in 后缀:

      AuthorizationT.objects.filter(ar_id__in=paidbill,status_flag=0).aggregate(Sum('recvd'))
      

      如果您通过ForeignKeyManyToMany 对模型的关系(ar_idpaid_id)进行建模,您将能够在单个 ORM 语句中轻松完成此操作

      【讨论】:

      • 我认为这里的问题是聚合不起作用,因为该字段是模型BillT 的一部分。问题来自原始查询
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2019-06-30
      • 2020-09-11
      相关资源
      最近更新 更多