Skip to main content
 首页 » 编程设计

python之Django queryset之是否可以在 FloatField 上进行过滤

2025年05月04日39yyy_WW

我正在尝试执行一个非常简单的操作,但遇到了问题。 我有一个简单的模型:

class MyModel(models.Model): 
    date = models.DateTimeField(null=False) 
    value = models.FloatField(null=True) 
    interval = models.IntegerField(null=True) 

我的目标是获得具有最大值(value)的 MyModel 对象。

#Get the value 
value = MyModel.objects.filter(date__gte=’2014-05-01’, date__lte=’2014-05-31’).aggregate(Max(‘value’))[‘value__max’] 
 
# Get the object corresponding to the max value 
my_object = MyModel.objects.get(value=value) 

这段代码给我一个错误:“匹配的查询不存在”…… 我试图硬编码一个值(存在),我有同样的错误。

我做错了什么吗?不能在 FloatField 上进行过滤吗?

谢谢。

请您参考如下方法:

这与 float 在 Python 中的表示方式有关(Django 的 FloatField 映射到 Python 的 float 和 Django 的 DecimalField 映射到 Python 的 decimal;参见 here )。

不同之处在于 float 不精确,因为它们在您的计算机上的表示方式,decimal 类型旨在解决通过以下方式出现的一些问题那(看看 docs,他们对此解释得很好)。

现在考虑到您尝试通过精确匹配获取 float 的情况,您可以尝试两件事:

  1. 将 MyModel 上的 value 类型更改为 DecimalField (即 value = models.DecimalField(max_digits=5, decimal_places=2, null=True))

  2. 如果您希望将类型保留为 FloatField,您可以尝试查询一系列值,但最终可能会得到多个结果(因此 MyModel. objects.get() 可能会抛出异常,提示查询返回了超过 1 个结果):MyModel.objects.filter(value__range=(1.23, 1.24)) 或 MyModel.objects.filter(value__gte=1.23, value__lt=1.24)