扩展Django Site模型后迁移文件生成至site-packages而非本地应用的问题
问题原因解析
- app_label的核心作用:Django的迁移系统完全靠
app_label识别模型所属的应用。你给SiteSettings设置app_label='sites',等于明确告诉Django:这个模型是内置django.contrib.sites应用的一部分,不是你本地创建的应用。 - 首次迁移无本地文件的原因:第一次执行
makemigrations时,Django检测到'sites'是已存在的内置应用,不会在你的本地应用目录生成迁移文件,而是将该模型的迁移逻辑归到内置sites应用的迁移体系中。 - 后续迁移文件跑到site-packages的原因:当你给
SiteSettings添加字段时,Django会判定这是对内置sites应用模型的修改,自然会把新的迁移文件生成到site-packages/django/contrib/sites/migrations/——因为这是内置sites应用的默认迁移目录。
正确做法
直接删除app_label='sites'的配置,Django会自动将SiteSettings归到它所在的本地应用下,后续所有迁移文件都会正常生成在你本地应用的migrations目录里。关联Site模型只需要保留OneToOneField即可,完全不需要修改app_label。
内容的提问来源于stack exchange,提问作者wjh18
相关产品推荐
相关产品推荐

