加入来自不同基础模型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
...

我收到以下错误:无法在两个不同的基本模型上组合查询。

有人知道如何做到这一点吗?

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

胜利在望!

如果要进行并集,则应将这些querysets转换为python set对象。

如果可以正确地过滤查询集本身,那么您真的应该这样做!

使用itertools.chain:

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

注意:您需要将生成的对象转换为一个列表,以便Django能够处理它。

我遇到了同样的问题。我使用并集方法combined_queryset = qs1.union(qs2) 解决了它

使用您的示例:report = ledger.union(journal)

相关内容

  • 没有找到相关文章

最新更新