2014-10-19 57 views
1

我有一個表table_object_price。字段:field_sale_currency_value是貨幣的名稱,field_sale_whole_value是價格的名稱。django 1.4:我在查詢集額外的錯誤

class Object(Node): 
    id = models.OneToOneField('Nod', parent_link=True, db_column='id') 
    name = models.TextField(blank=True, null=True) 
    field_sale_currency_value = models.TextField(blank=True, null=True) 
    field_sale_whole_value = MIntegerField(blank=True, null=True) 

這SQL代碼使得排序:

SELECT *, 
    CASE field_sale_currency_value 
    when 'RUR' then field_sale_whole_value/40 
    when 'USD' then field_sale_whole_value 
    when 'EUR' then field_sale_whole_value/0.7423 
    field_sale_currency_value FROM welhome.welhome_content_type_object ORDER BY cost_usd ; 

但我需要使用Django額外的,因爲我的功能得到查詢集:

def sort_queryset(queryset): 
    queryset = queryset.extra(select={'cost_usd':'(case field_sale_currency_value when "RUR" then field_sale_whole_value/40 when "USD" then field_sale_whole_value when "EUR" then field_sale_whole_value/0.7423 end)'}, order_by=["cost_usd"]) 
return queryset 

而且這是行不通的。

Error Cannot resolve keyword 'cost_usd' into field 

回答

1

Django docs

如果你需要使用一些新的 字段或表已包含的通過extra()命令所產生的查詢集使用ORDER_BY 參數extra()和傳遞順序的字符串。這些字符串 應該是您在extra()的select參數中指定的模型字段(如正常的order_by()方法中的 查詢集),形式table_name.column_name或 列的別名。

所以,你需要做的是:

queryset = queryset.extra(select={'cost_usd':'(case field_sale_currency_value when "RUR" then field_sale_whole_value/40 when "USD" then field_sale_whole_value when "EUR" then field_sale_whole_value/0.7423 end)'}) 
queryset = queryset.extra(order_by = ['cost_usd']) 
+0

謝謝你,但它不工作。無法將關鍵字'cost_usd'解析爲字段 – voice 2014-10-19 13:06:37

+0

@voice確保您從第一個「extra()」調用中移除了'order_by'調用。 – 2014-10-19 13:08:25

+0

我從pycharm中拷貝了這個:queryset = queryset.extra(select = {'cost_usd':'(case「field」)當field爲「field」時field_sale_currency_value爲field_sale_whole_value/40當「USD」時field_sale_whole_value爲field_sale_whole_value爲「EUR」時field_sale_whole_value/0.7423結束)'} ) queryset = queryset.extra(order_by = ['cost_usd']) – voice 2014-10-19 13:12:36