2011-07-18 10 views
10

Mam obecnie dwa różne modele.Dołącz do wielu zapytań z różnych modeli podstawowych Django

class Journal(models.Model): 
    date = models.DateField() 
    from_account = models.ForeignKey(Account,related_name='transferred_from') 
    to_account = models.ForeignKey(Account,related_name='transferred_to') 
    amount = models.DecimalField(max_digits=8, decimal_places=2) 
    memo = models.CharField(max_length=100,null=True,blank=True) 

class Ledger(models.Model): 
    date = models.DateField() 
    bank_account = models.ForeignKey(EquityAccount,related_name='paid_from') 
    account = models.ForeignKey(Account) 
    amount = models.DecimalField(max_digits=8, decimal_places=2) 
    name = models.ForeignKey(Party) 
    memo = models.CharField(max_length=100,null=True,blank=True) 

tworzę raport w widoku i pojawia się następujący błąd: Łączenie klas „ValuesQuerySet” musi obejmować te same wartości w każdym przypadku.

Co próbuję zrobić, to tylko wyciągnąć pola, które są wspólne, więc mogę połączyć oba z nich, np.

def report(request): 

    ledger = GeneralLedger.objects.values('account').annotate(total=Sum('amount')) 
    journal = Journal.objects.values('from_account').annotate(total=Sum('amount')) 
    report = ledger & journal 
... 

Jeśli próbuję zrobić je dokładnie takie same, aby przetestować np.

def report(request): 

    ledger = GeneralLedger.objects.values('memo').annotate(total=Sum('amount')) 
    journal = Journal.objects.values('memo').annotate(total=Sum('amount')) 
    report = ledger & journal 
... 

otrzymuję ten błąd: Nie można połączyć kwerendy na dwóch różnych modelach bazowych.

Ktoś wie, jak można to osiągnąć?

Odpowiedz

17
from itertools import chain 
report = chain(ledger, journal) 

Itertools za wygraną!

Jeśli chcesz zrobić Unii, powinieneś przekonwertować te querysets na obiekty pythonowe set.

Jeśli możliwe jest prawidłowe filtrowanie samego zestawu zapytań, naprawdę powinieneś to zrobić!

Powiązane problemy