2016-01-20 50 views
2

几个字段注释,我有两个型号:的Django上与相同型号

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的壳,我能够做这样的事情:

accounts_count = user_transactions.filter(Q(account=account)|Q(source_account=account)).count() 

这给了正确的答案。有什么我做错了吗?有人能指出我正确的方向吗?任何援助是高度赞赏。

回答

2

我会将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

+0

我必须在'Count'调用中添加'distinct = True'。谢谢。 – lenny

0

的问题是,您的交易有ForgeinKeys账户我会建议尝试这样的事情

class Transaction(models.Model): 
    .... 
    account = models.ForeignKey(Account, related_name="transaction_account") 
    source_account = models.ForeignKey(Account, null=True, related_name="transaction_source_account") 

然后在您的查询:

queryset.annotate(transactions_count=((Count('transaction_account') + Count('transaction_source_account'))