Django 对小数字段的查询
我有一个 DecimalField 值为 5.60 的对象。我正在查询:
Mdl.objects.get(speed__iexact="5.60")
这将返回正确的结果。但这不会:
Mdl.objects.get(speed__iexact="5.6")
有没有办法自动调和这种不一致?过滤器值是用户提供的,因此我想确保输入 5.6 的用户可以找到该对象。
I have an object with a DecimalField value of 5.60. I'm making a query:
Mdl.objects.get(speed__iexact="5.60")
This will return the correct result. But this will not:
Mdl.objects.get(speed__iexact="5.6")
Is there a way to automatically reconcile this inconsistency? The filter value is user provided, so I want to be sure that a user typing 5.6 can find the object.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
iexact 进行不区分大小写的相等检查,通常用于字符串。对于有两位小数的小数,Django 数据库后端可能会将“5.60”存储为 DecimalField 的字符串,因此 iexact-comparison 会起作用,因为字符串相等。但是当您想要比较数字而不是字符串时,您应该只使用普通的相等运算符。
不要使用字符串,而是使用 Python 内置的 Decimal 类型。当使用 Django 检索模型实例时,无论如何您都会获得该类型的实例,因此您还应该分配该类型以保持一致。
iexact
does an case-insensitive equality check, which is normally used for strings. For decimals with two decimal places, the Django database backend will probably store "5.60" as string for aDecimalField
, so iexact-comparison with that will work because the strings are equal. But as you want to compare numbers, not strings, you should just use the normal equality operator.Don't use strings, instead use the Python-builtin Decimal type. When retrieving model instances with Django, you will get instances of that type anyway, so you should also assign this type in order to be consistent.