我正在尝试执行一个非常简单的操作,但遇到了问题。 我有一个简单的模型:
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 的情况,您可以尝试两件事:
将
MyModel上的value类型更改为DecimalField(即value = models.DecimalField(max_digits=5, decimal_places=2, null=True))如果您希望将类型保留为
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)
