Skip to main content
 首页 » 编程设计

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

2024年10月24日35zhengyun_ustc

我有两个模型:

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