2014-10-19 58 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