2011-07-18 9 views
10

現在、2つの異なるモデルがあります。異なる基本モデルから複数のクエリセットを結合する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オブジェクトに変換する必要があります。

クエリーセット自体を正しくフィルタリングすることができれば、本当にそれを実行する必要があります。

関連する問題