简体   繁体   中英

Django Queryset compare two different models with multiple rows

I have these two models that I would like to return the sum of. I get an database error about the subquery returning more than one row. What would be the best way to compare both without using a for statement?

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)

Query I tried

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

In SQL I know it would be

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

I'm looking for the equivalent in queryset

I think you won't be able to achieve without a for loop because I think you need to join the tables as there is a filtration on both tables and you want to sum a field from the first table. The way to join tables would be prefetch_related() or select_related() but they utilize foreign keys.

This leads me to a suggestion that the id fields: bill_id and ar_id should be normalized as it looks like there will be data duplication. Using a relationship would also make making queries simpler.

Since paidbill is a list, you have to use the __in suffix in your query:

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

If you model the relation of the models ( ar_id , paid_id ) via a ForeignKey or ManyToMany , you will be able to do this trivially in a single ORM statement

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM