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

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')),
            ],
        ),
    ]

问题根源

  1. 字段末尾多余逗号:ProjectComment和Comment模型的每个字段末尾都加了逗号,导致这些字段被解析为单元素元组,而非Django可识别的模型字段实例,迁移时只会生成默认ID字段。
  2. 缩进错误:ProjectComment模型的字段没有缩进,会导致模型解析异常。
  3. 字段类型错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:45:00