2014-06-18 59 views
2

假設我有以下的模型結構:如何計算總兩個字段的每個項目在查詢集

class SomeModel(Model): 
    base_price = DecimalField(....) 
    commision = DecimalField(....) 

我不想存儲total_price在我的數據庫中數據的一致性,並希望來計算的話作爲base_price + commision

SomeModel.Objects.all().xxxxxx(total_price=base_price + commision) 

所以我的數據庫(PostgreSQL的9.1)計算將不記錄它的數據庫中返回的查詢集將包含total_price每條記錄​​是和上回吧該記錄的和commision。如果我可以在計算字段上使用filter,這也會很好。

我該怎麼做?

我想要的東西,類似於下面的SQL:

select ("base_price" + "commision") as total_price, base_price, commision from some_table; 

total_price | base_price | commision 
------------------------------------- 
    15.0 | 14.0  | 1.0 
    22.0 | 20.0  | 2.0 

回答

2

可以使用extra() QuerySet的方法:

SomeModel.objects.extra(select={'total_price': 'base_price + commission'}) 

以上會total_price屬性添加到每個項目在QuerySet中。然而,你會不是能夠過濾它 - 你會得到一個FieldError: Cannot resolve keyword 'total_price' into field

2.有一個undocumented way使用annotate()來添加一個可以過濾的字段。在你的情況下,它會是這樣的:

from django.db.models import Max 

# with this method the total_price can be filtered on 
SomeModel.objects.annotate(
    total_price=Max('base_price', field='base_price + commission') 
).filter(total_price__lt=20) 
相關問題