Django 2.0.3调用delete()报'models aren't loaded yet'及Coin模型重复实例问题
解决Django 2.0.3中的两个常见问题
你遇到的这两个问题在Django 2.0.x版本里其实挺常见的,我来给你拆解下临时解决办法:
一、处理调用delete()时的'models aren't loaded yet'错误
这个错误本质是数据库操作触发时机过早——Django还没完成所有模型的加载流程,你就调用了delete()方法。常见场景是在models.py里直接写了delete()执行代码,或者在项目初始化阶段(比如__init__.py、未延迟加载的工具模块)引用模型并执行操作。
临时修复方案:
- 把
delete()逻辑移到Django启动完成后执行:比如写一个自定义管理命令(放在coins/management/commands/目录下),或者在视图函数、post_migrate信号里触发删除操作。 - 如果必须在模型文件里处理,用延迟加载模型的方式:
from django.apps import apps def delete_old_coins(): # 用apps.get_model延迟获取模型,确保Django已加载所有模型 Coin = apps.get_model('coins', 'Coin') Coin.objects.filter(your_condition_here).delete() - 排查项目中提前加载的文件:比如
settings.py、urls.py里是否有引用模型并执行delete()的代码,这些地方都会导致模型未加载的问题。
二、避免重复创建Coin实例的临时方案
你当前的循环代码会无条件创建新的Coin实例,不管数据库里是否已有同名记录。临时可以用这两种方式解决:
方式1:使用get_or_create()(推荐)
这个方法是原子操作,会先尝试查询记录,不存在则创建,完美避免重复:
for each_item in list: # 返回值是(实例对象, 是否新创建的布尔值) coin_obj, is_created = Coin.objects.get_or_create(name=each_item) # 如果需要更新已有实例的其他字段,可在这里处理 # if not is_created: # coin_obj.description = "Updated description" # coin_obj.save()
方式2:先检查再创建
如果name字段不是唯一约束,或者你需要更灵活的判断逻辑,可以先检查是否存在:
for each_item in list: if not Coin.objects.filter(name=each_item).exists(): Coin.objects.create(name=each_item)
内容的提问来源于stack exchange,提问作者phil0s0pher
相关产品推荐
相关产品推荐

