2016-01-28 33 views
2

相同的模型這裏是我的模型我如何兩場的總和與另一場關於在Django

class Wallet(models.Model): 
    """ 
    Keep track of the monetary values of a company's wallet 
    """ 
    serializer_class = WalletSocketSerializer 

    company = models.OneToOneField(Company, verbose_name=_('company')) 
    packaged_credits = models.BigIntegerField(_('packaged credits'), default=0) 
    purchased_credits = models.BigIntegerField(_('purchased credits'), default=0) 
    low_credits_threshold = models.BigIntegerField(default=0) 

現在我想發送警報如果總學分低於閾值,這將是讓所有的小錢包在這SQL相當於

select * from wallets_wallet where (packaged_credits + purchased_credits) < low_credits_threshold;

我想知道如何執行,在Django的,現在我已經試過以下,它的工作原理,但我認爲它應該是以更多的Django方式完成:

low_wallets = [] 
     for wallet in Wallet.objects.all(): 
      if wallet.packaged_credits + wallet.purchased_credits < wallet.low_credits_threshold: 
       low_wallets.append(wallet) 

回答

2
from django.db.models import F 

low_wallets = Wallet.objects.filter(
    low_credits_threshold__gt=F('packaged_credits')+F('purchased_credits') 
) 
+0

感謝弗拉基米爾,我將與曼哈頓博士的回答去,因爲它看起來更優雅 –

+1

毫米優雅,但我看到django文檔聲稱使用它作爲最後的手段,所以你的答案在這裏 –

1

Wallet.objects.extra(其中= [ 「packaged_credits + purchased_credits < low_credits_threshold」])

+1

作爲[文檔說明](https://docs.djangoproject.com/en/1.9/ref/models/querysets/#extra) ,'extra'不鼓勵;如弗拉基米爾所示,這可以通過使用F函數來實現。 –