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

Django中.get_or_create函数异常反复生成重复对象问题求助

问题原因
  • 外键参数类型不匹配:Location模型的provider字段是外键类型,你在get_or_create中直接传入clean_machine["provider"],如果该值是Provider的主键id、字符串而非Provider实例,会导致查询条件无法匹配到已有记录,触发创建逻辑。创建时要么因为外键值不合法,要么触发unique_together联合唯一约束报错,直接进入except分支。
  • 经纬度精度/类型不匹配:模型中经纬度是DecimalField(decimal_places=6)类型,如果clean_location返回的经纬度是float类型,或者小数位数超过6位,会导致查询时的数值和数据库中存储的数值无法匹配,每次都认为没有对应记录需要创建。
  • 数据库层唯一约束未生效:如果你新增unique_together配置后没有执行迁移,数据库中不存在对应的联合唯一索引,就会允许重复数据插入,出现created始终为True的情况。
解决方案
  • 修正外键查询逻辑:如果clean_machine["provider"]存储的是Provider的主键值,把查询参数改为provider_id=clean_machine["provider"];如果是其他值,先查询得到对应的Provider实例再传入参数。
  • 统一经纬度类型精度:将clean_location返回的latitude、longitude统一转为Decimal类型,且保留6位小数,避免类型和精度差异导致匹配失败:
from decimal import Decimal, ROUND_HALF_UP
# 处理经纬度示例
clean_lat = Decimal(str(clean_location["latitude"])).quantize(Decimal('0.000001'), rounding=ROUND_HALF_UP)
clean_lng = Decimal(str(clean_location["longitude"])).quantize(Decimal('0.000001'), rounding=ROUND_HALF_UP)
  • 确认数据库约束生效:执行python manage.py makemigrations和python manage.py migrate,确保联合唯一索引已经同步到数据库。
  • 排查参数匹配性:在get_or_create执行前打印三个查询参数的具体值和类型,和数据库中已有的记录对比,确认参数完全一致。

内容的提问来源于stack exchange,提问作者Angela Rubchinksy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:06:02