Django 对小数字段的查询

发布于 2024-10-10 00:50:55 字数 253 浏览 1 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半岛未凉 2024-10-17 00:50:55

iexact 进行不区分大小写的相等检查,通常用于字符串。对于有两位小数的小数,Django 数据库后端可能会将“5.60”存储为 DecimalField 的字符串,因此 iexact-comparison 会起作用,因为字符串相等。但是当您想要比较数字而不是字符串时,您应该只使用普通的相等运算符。

from decimal import Decimal
Mdl.objects.get(speed=Decimal("5.6"))

不要使用字符串,而是使用 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 a DecimalField, 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.

from decimal import Decimal
Mdl.objects.get(speed=Decimal("5.6"))

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文