2016-01-20 46 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'))