【问题标题】:django 1.4 : I get an error in queryset extradjango 1.4:我在额外的查询集中得到一个错误
【发布时间】:2014-12-14 13:18:46
【问题描述】:

我有一张桌子table_object_price。字段:field_sale_currency_value 是货币名称,field_sale_whole_value 是价格名称。

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

【问题讨论】:

    标签: python mysql django orm


    【解决方案1】:

    来自Django docs

    如果您需要使用一些新的命令来订购生成的查询集 您通过 extra() 包含的字段或表格使用 order_by 参数到extra() 并传入一个字符串序列。这些字符串 应该是模型字段(如在正常的order_by() 方法中 查询集),形式为 table_name.column_name 或 您在 extra() 的 select 参数中指定的列。

    所以,你需要这样做:

    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'])
    

    【讨论】:

    • 谢谢,但它不起作用。无法将关键字“cost_usd”解析为字段
    • @voice 确保您从第一个 extra() 呼叫中删除了 order_by 呼叫。
    • 我从 pycharm 复制了这个: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'])
    • @voice 进行更改后您是否重新启动了服务器?
    • 是的,我又重新启动了。
    猜你喜欢
    • 2016-02-21
    • 2015-01-05
    • 1970-01-01
    • 2019-07-16
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多