Django查询MongoDB int32字段时Decimal比较错误求助
解决Django查询MongoDB时Decimal与int32类型不匹配的问题
问题原因
你的模型中unit_price字段大概率定义为DecimalField,但MongoDB里实际存储的是int32类型。Django的MongoDB后端(如djongo)会将MongoDB的int32解析为Decimal类型,查询时传入的整数参数在数据库层面无法直接和Decimal类型做比较,因此触发报错。查询字符串字段正常是因为类型匹配没有冲突。
解决方案
1. 修正模型字段类型(推荐)
既然MongoDB中unit_price是int32,直接把模型里的字段改成IntegerField,让模型和存储类型完全匹配:
from django.db import models class Product(models.Model): unit_price = models.IntegerField() # 其他字段定义...
修改后重新运行迁移命令(开发环境可直接执行,生产环境注意数据兼容):
python manage.py makemigrations python manage.py migrate
之后执行Product.objects.filter(unit_price__lt=30)即可正常查询。
2. 使用MongoDB原生查询(无需修改模型)
如果无法修改模型字段,可以直接使用MongoDB的原生查询语法绕过Django ORM的类型转换:
# 返回模型实例列表 query_product = Product.objects.raw_query({'unit_price': {'$lt': 30}})
raw_query是djongo特有的方法,直接传递MongoDB的查询文档,避免Django ORM的类型映射冲突。
3. 用自定义Func转换字段类型
如果需要保留DecimalField模型,可以通过自定义Func调用MongoDB的$toInt操作符,将存储的int32字段转换后再比较:
from django.db.models import F, Func from yourapp.models import Product class ToInt(Func): function = '$toInt' # 转换后再进行小于比较 query_product = Product.objects.filter(ToInt(F('unit_price')) < 30)
该方案依赖于你的MongoDB后端支持自定义Func操作,使用djongo通常可以正常工作。
内容的提问来源于stack exchange,提问作者Saqib Rehman
相关产品推荐
相关产品推荐

