2011-07-18 53 views
10

我目前有兩種不同的模型。從不同的基本模型加入多個查詢集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) 

我創建一個視圖的報告,並得到了以下錯誤: 合併「ValuesQuerySet」類必須包含在每種情況下相同的值。

我想要做的只是拉出常見的字段,以便我可以將它們連接起來,例如

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 
... 

如果我嘗試使它們完全相同以測試

def report(request): 

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

我得到這個錯誤: 不能在兩個不同的基本型號組合查詢。

任何人都知道如何做到這一點?

回答

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

Itertools爲贏!

如果你想做一個聯盟,你應該將這些querysets轉換成python set對象。

如果可以正確過濾查詢集本身,您應該真的這麼做!