首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django对象过滤器-价格行为奇怪,例如170被视为17等

Django对象过滤器-价格行为奇怪,例如170被视为17等
EN

Stack Overflow用户
提问于 2012-08-07 17:50:39
回答 1查看 458关注 0票数 0

我有一个使用price__ltprice__gt的简单对象过滤器。它作用于我的产品模型中一个名为price的属性,它是一个CharField string

似乎在将这些值传递给过滤器时,它们被以一种奇怪的方式处理,例如10被视为100。例如:

/products/price/10-200/返回定价为100-200的产品。过滤器以filterargs:FILTER ARGS: {'price__lt': '200', 'price__gt': '10'}的形式传入。这也打破了价格/0- 170将不会返回定价为18.50的产品的意义;出于某种原因,它将170视为“小于18”。

你知道是什么导致了这个问题吗,以及如何修复它?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-08-07 21:20:13

问题是,正如杰夫所说,价格是一个价格,因此使用逐个字符的字符串比较逻辑进行比较,即以1开头的任何长度的字符串将小于以2开头的任何长度的字符串,依此类推。

我很好奇让IntegerField作为一个CharField有什么问题,因为这似乎是一个简单的解决方案,但如果你需要保持价格作为一个查询,这里有一个(老生常谈的)方法来使查询工作:

代码语言:javascript
复制
lt = 200
gt = 10
qs = Product.objects.extra(select={'int_price': 'cast(price as int)'},
                           where=['int_price < %s', 'int_price > %s'],
                           params=[lt, gt])
qs.all()  # the result

这使用了Django的QuerySet类的extra方法,您可以在文档here中了解到该方法。简而言之,它使用SQL的cast表达式计算字符串价格的整数版本,然后根据该表达式过滤整数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11843342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档