gpt4 book ai didi

python - Django 注释与同一模型相关的几个字段

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:16 25 4
gpt4 key购买 nike

我有两个模型:

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

关于python - Django 注释与同一模型相关的几个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com