Django Queryset将两个不同的模型与多行进行比较

时间:2016-11-18 19:55:46

标签: python sql django django-queryset

我有这两个模型,我想返回它的总和。我收到有关返回多行的子查询的数据库错误。在不使用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

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

2 个答案:

答案 0 :(得分:0)

我认为你在没有for loop的情况下无法实现,因为我认为你需要加入表格,因为两个表都有过滤,你想要从第一个表中求和一个字段。连接表的方式是prefetch_related()select_related(),但它们使用外键。

这引出了一个建议,id fields: bill_id and ar_id应该被标准化,因为看起来会有数据重复。使用关系也可以使查询更简单。

答案 1 :(得分:0)

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

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

如果您通过ar_idpaid_id对模型(ForeignKeyManyToMany)的关系进行建模,则可以在单个ORM中轻松完成此操作声明