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

Django 4自定义Varchar类型主键未被迁移文件识别的解决问询

解决Django迁移不识别自定义CharField主键的问题

可能的原因及对应解法

1. 修正模型字段的语法错误

你的mid字段定义末尾多了一个冗余逗号,这会导致Django无法正确解析该字段:

# 错误写法(末尾多了逗号)
mid = models.CharField(max_length=10, primary_key=True, verbose_name='custom ID'),

改为正确的定义:

mid = models.CharField(max_length=10, primary_key=True, verbose_name='custom ID')

2. 清除旧迁移的缓存干扰

  • 删除当前APP下migrations目录中除__init__.py外的所有迁移文件
  • 在PostgreSQL中执行SQL,清空该APP的迁移记录:
    DELETE FROM django_migrations WHERE app='你的APP名称';
    
  • 重新执行迁移命令:
    python manage.py makemigrations
    python manage.py migrate
    

3. 检查模型继承/代理冲突

如果Report模型继承了其他模型或属于代理模型,可能会被父类的主键设置覆盖。确认Report是独立的基础模型,或在继承时显式指定主键字段。

4. 手动编写迁移强制替换主键

若上述方法无效,可手动创建迁移文件强制变更:

  • 生成空迁移文件:
    python manage.py makemigrations --empty 你的APP名称
    
  • 在生成的迁移文件中添加如下操作代码:
    from django.db import migrations, models
    
    class Migration(migrations.Migration):
        dependencies = [
            ('你的APP名称', '上一个迁移文件的名称'),
        ]
    
        operations = [
            migrations.RemoveField(
                model_name='report',
                name='id',
            ),
            migrations.AddField(
                model_name='report',
                name='mid',
                field=models.CharField(max_length=10, primary_key=True, verbose_name='custom ID'),
            ),
        ]
    
  • 执行迁移完成变更:
    python manage.py migrate
    

5. 直接验证数据库表结构

若迁移后仍异常,可直接查看PostgreSQL中Report对应的表结构,确认是否残留默认id字段。备份数据后手动删除该字段,再重新执行迁移。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:12:48