我有一个使用price__lt和price__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”。
你知道是什么导致了这个问题吗,以及如何修复它?谢谢!
发布于 2012-08-07 21:20:13
问题是,正如杰夫所说,价格是一个价格,因此使用逐个字符的字符串比较逻辑进行比较,即以1开头的任何长度的字符串将小于以2开头的任何长度的字符串,依此类推。
我很好奇让IntegerField作为一个CharField有什么问题,因为这似乎是一个简单的解决方案,但如果你需要保持价格作为一个查询,这里有一个(老生常谈的)方法来使查询工作:
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表达式计算字符串价格的整数版本,然后根据该表达式过滤整数。
https://stackoverflow.com/questions/11843342
复制相似问题