2016-11-18 5 views
0

Ich habe diese beiden Modelle, die ich gerne die Summe zurückgeben würde. Ich erhalte einen Datenbankfehler bezüglich der Unterabfrage, die mehr als eine Zeile zurückgibt. Was wäre der beste Weg, beides zu vergleichen, ohne eine For-Anweisung zu verwenden?Django Queryset vergleichen zwei verschiedene Modelle mit mehreren Zeilen

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) 

Abfrage habe ich versucht,

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

In SQL weiß ich es

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

wäre ich für das Äquivalent in queryset suchen

Antwort

0

Ich denke, Sie werden nicht in der Lage zu sein, ohne eine for loop zu erreichen, weil ich denke, dass Sie die Tabellen beitreten müssen, da es eine Filtration auf beiden tabl gibt es und Sie wollen ein Feld aus der ersten Tabelle summieren. Der Weg, um Tabellen zu verbinden, wäre prefetch_related() oder select_related(), aber sie verwenden Fremdschlüssel.

Dies führt mich zu einem Vorschlag, dass die id fields: bill_id and ar_id normalisiert werden sollte, da es aussieht, als würde es Datenduplizierung sein. Die Verwendung einer Beziehung würde auch das Erstellen von Abfragen vereinfachen.

0

Seit paidbill ist eine Liste, müssen Sie das __in Suffix in Ihrer Abfrage verwenden:

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

Wenn Sie die Beziehung der Modelle modellieren (ar_id, paid_id) über eine ForeignKey oder ManyToMany, werden Sie in der Lage, dies in einer einzigen ORM-Anweisung trivial zu tun

+0

Ich denke, das Problem hier wäre Aggregat wird nicht arbeiten, weil das Feld Teil des Modells 'BillT' ist. Das Problem stammt von der ursprünglichen Abfrage – Aditya

Verwandte Themen