Django查询:如何筛选值为Decimal('NaN')的DailyPrice对象?
如何查询Django中close字段为Decimal('NaN')的DailyPrice对象?
先看你的模型定义:
class DailyPrice(models.Model): date = models.DateField() close = models.DecimalField( max_digits=15, decimal_places=2, )
你已经确认存在close字段为Decimal('NaN')的记录,但用DailyPrice.objects.filter(close__isnull=True)查不到结果——这很正常,因为Decimal('NaN')并不是数据库层面的NULL值,它是一个合法的Decimal类型值,只是语义上表示非数字,所以isnull=True根本匹配不到这类记录。
要筛选出close为Decimal('NaN')的记录,你可以利用NaN的数学特性:它不等于任何值,包括它自己,通过原生SQL条件来实现查询:
DailyPrice.objects.extra(where=['close != close'])
这个方法的原理是:数据库中只有NaN值会满足close != close的条件,普通数值和NULL都不会触发这个判断(NULL和任何值比较都是NULL,不会返回true),所以能精准筛选出你要的记录。
如果你使用的是PostgreSQL数据库,还可以用更贴合数据库特性的方式,直接匹配NaN的字面量:
from django.db.models import F, Value from django.db.models.functions import Cast DailyPrice.objects.filter(close=Cast(Value('NaN'), output_field=models.DecimalField()))
不过这种方式的兼容性不如第一种通用,extra()的方法在大多数关系型数据库(MySQL、PostgreSQL、SQLite等)里都能正常工作。
执行上面的查询后,你应该就能拿到所有close为Decimal('NaN')的DailyPrice对象了。
内容的提问来源于stack exchange,提问作者user3595632
相关产品推荐
相关产品推荐

