我有这两个模型,我想返回它的总和。我收到有关返回多行的子查询的数据库错误。在不使用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
我正在寻找查询集中的等价物
答案 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_id
或paid_id
对模型(ForeignKey
,ManyToMany
)的关系进行建模,则可以在单个ORM中轻松完成此操作声明