異なるベースモデルから複数のクエリセットを結合する Django 質問する

異なるベースモデルから複数のクエリセットを結合する Django 質問する

現在、2つの異なるモデルを所有しています。

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

次のエラーが発生します: 2 つの異なる基本モデルでクエリを組み合わせることはできません。

これを実現する方法を知っている人はいますか?

ベストアンサー1

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

イターツール勝利のために!

Union を実行する場合は、これらをquerysetsPythonsetオブジェクトに変換する必要があります。

クエリセット自体を適切にフィルタリングできる場合は、ぜひそうしてください。

おすすめ記事