Django模型字段无法在数据库创建的问题排查求助
Django模型迁移仅生成默认ID字段的问题解决
问题描述
开发项目管理应用时,创建ProjectComment模型并添加自定义字段后,数据库仅生成默认ID字段;删除迁移记录和数据库表重建后问题依旧。新建Comment模型执行迁移,仍只生成ID字段,无自定义字段。
相关代码
Project模型
class Project(models.Model): project_id = models.CharField( primary_key=True, max_length=50, null=False, blank=False, ) project_owner2 = models.ForeignKey(Entity, on_delete=models.CASCADE, default='916 075 855', #dette er bruker sin organisasjon ) direction = models.CharField( max_length=50, null=True, blank=True, ) title = models.CharField( unique=True, max_length=50, null=False, blank=False, ) scope = models.TextField( verbose_name='Scope', # denne må få nytt navn help_text='Her skal du beskrive prosjektets omfang', max_length=2000, null=True, blank=True, ) project_status_choices = ( ('PLANNED', 'Planned'), ('ACTIVE', 'Active'), ('ON_HOLD', 'On hold'), ('COMPLETED', 'Completed'), ('CANCELLED', 'Cancelled'), ) project_create = models.DateField( verbose_name='Project creation date', help_text='When the project was initiated', null=True, blank=True, ) project_start = models.DateField( verbose_name='Project start date', help_text='Her skal du beskrive prosjektet', null=True, blank=True, ) project_end = models.DateField( verbose_name='Project end date', help_text='Originaly end date', null=True, blank=True, ) class Meta: pass def __str__(self): return self.title
ProjectComment模型(问题版本)
class ProjectComment(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE), pub_date = models.DateTimeField(auto_created=True, editable=False), comment = models.TextField(max_length=2000, null=False, blank=False), user = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): template = '{0.project} {0.pub_date} {0.user}' return template.format(self)
初始迁移文件
# Generated by Django 4.0.6 on 2023-03-19 08:35 from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Project', fields=[ ('project_id', models.CharField(max_length=50, primary_key=True, serialize=False)), ('title', models.CharField(max_length=50, unique=True)), ('purpose', models.TextField(max_length=2000, null=True, verbose_name='Purpose')), ('scope', models.TextField(blank=True, max_length=2000, null=True, verbose_name='Scope')), ('project_start', models.DateField(blank=True, null=True, verbose_name='Project start date')), ('project_end', models.DateField(blank=True, null=True, verbose_name='Project end date')), ], ), migrations.CreateModel( name='ProjectComment', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), ]
新建Comment模型(问题版本)
class Comment(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE), publication_date = models.DateTimeField(auto_created=True, editable=False), comment_field = models.TextField(max_length=2000, null=False, blank=False), user = models.TextField(max_length=2000, null=False, blank=False), def __str__(self): template = '{0.project} {0.pub_date} {0.user}' return template.format(self)
新建Comment模型后的迁移文件
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('projects', '0008_alter_departementalroles_options_and_more'), ] operations = [ migrations.CreateModel( name='Comment', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], ), ]
问题根源
- 字段末尾多余逗号:
ProjectComment和Comment模型的每个字段末尾都加了逗号,导致这些字段被解析为单元素元组,而非Django可识别的模型字段实例,迁移时只会生成默认ID字段。 - 缩进错误:
ProjectComment模型的字段没有缩进,会导致模型解析异常。 - 字段类型错误:
Comment模型的user字段误用TextField,不符合关联用户的需求。
解决方案
1. 修正模型代码
去掉字段末尾的逗号,修正缩进,调整错误字段类型:
修正后的ProjectComment模型
class ProjectComment(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) pub_date = models.DateTimeField(auto_created=True, editable=False) comment = models.TextField(max_length=2000, null=False, blank=False) user = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): template = '{0.project} {0.pub_date} {0.user}' return template.format(self)
修正后的Comment模型
class Comment(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) publication_date = models.DateTimeField(auto_created=True, editable=False) comment_field = models.TextField(max_length=2000, null=False, blank=False) user = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): template = '{0.project} {0.publication_date} {0.user}' return template.format(self)
2. 重新执行迁移
- 删除之前为
Comment模型生成的错误迁移文件 - 生成新迁移:
python manage.py makemigrations - 同步数据库:
python manage.py migrate
3. 验证结果
查看数据库对应表,确认自定义字段已正常生成。
内容的提问来源于stack exchange,提问作者LegalGeek
相关产品推荐
相关产品推荐

