我有两个模型:
class Account(models.Model):
...
class Transaction(models.Model):
....
account = models.ForeignKey(Account)
source_account = models.ForeignKey(Account, null=True)
我需要显示每个用户帐户的交易数量。 Django 的 annotate 似乎是完成这项任务的合适工具。我做了:
queryset = models.Account.objects.filter(user=self.request.user)
queryset.annotate(transactions_count=Count('transaction'))
这为 account 字段设置为谓词帐户的交易提供了正确的数字,但遗漏了 source_account 设置为谓词帐户的交易。
使用 Django shell 我可以做类似的事情:
accounts_count = user_transactions.filter(Q(account=account)|Q(source_account=account)).count()
这给出了正确答案。我做错了什么吗?有人能指出我正确的方向吗?非常感谢任何帮助。
请您参考如下方法:
我会将 related_name 设置为您的 ForeignKey 字段。然后与他们一起工作会更容易一些。因此,例如在您的模型中让我们设置:
class Transaction(models.Model):
...
account = models.ForeignKey(Account, related_name='transactions')
source_account = models.ForeignKey(Account, null=True, related_name='source_transactions')
然后可以做类似的事情:
queryset = models.Account.objects.filter(user=self.request.user).annotate(transactions_count=(Count('transactions')+Count('source_transactions'))
它也可以在没有命名的情况下工作,它只是更具可读性和更容易。重点是在annotate中将两个Count作为一个字段添加。
解决这些类型问题的最佳方法是在原始 SQL 中想象它们,然后尝试在 Django ORM 中模仿它们。 (在原始 sql 中,您还可以简单地添加两列,例如 SELECT (a.col + a.col2) AS count
