2016-11-18 82 views
0

我有這兩個模型,我想返回的總和。我得到一個關於返回多行的子查詢的數據庫錯誤。不使用for語句比較兩者的最佳方法是什麼?Django Queryset比較兩個不同的模型與多行

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

我想你不會能夠實現沒有for loop,因爲我認爲你需要加入表格,因爲兩個表格都有過濾並且你想從第一個表中總結一個字段。連接表的方式是prefetch_related()select_related(),但它們使用外鍵。

這導致我建議id fields: bill_id and ar_id應該正常化,因爲它看起來會有數據重複。使用關係還可以使查詢更簡單。

0

由於paidbill是一個列表,你必須使用__in後綴查詢:如果您是通過ForeignKeyManyToMany模型(ar_idpaid_id)的關係模型

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

,你會能夠在單個ORM語句中輕鬆地做到這一點

+0

我認爲這裏的問題將不會工作,因爲該字段是'BillT'模型的一部分。問題來自原始查詢 – Aditya