You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:07:03