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

Django修改models.py后0001_initial.py未更新,数据库无变化求助

Django迁移不生效:新增模型字段未同步到数据库

我是Django/Python新手,在models.py里加了几个属性,保存后执行了py manage.py makemigrations和py manage.py migrate命令,但0001_initial.py里看不到新增的属性,用DB Browser for SQLite打开数据库还是旧结构。

我的代码:

models.py

from django.db import models


# from django.contrib.auth.models import User

# Create your models here.
    category_choice = (
        ('Allgemein', 'Allgemein'),
        ('Erkältung', 'Erkältung'),
        ('Salben & Verbände', 'Salben & Verbände'),
    )

class medicament(models.Model):
    PZN = models.CharField(max_length=5, primary_key=True) # Maxlaenge auf 5 aendern
    name = models.CharField('Medikament Name', max_length=100)
    description = models.CharField('Medikament Beschreibung', max_length=500)
    category = models.CharField(max_length=100, blank=True, null=True, choices=category_choice)
    instructionsForUse = models.CharField('Medikament Einnehmhinweise', max_length=400)
    productimage = models.ImageField(null=True, blank=True, upload_to="images/")
    stock = models.PositiveIntegerField(default='0')
    reorder_level = models.IntegerField(default='0', blank=True, null=True)
    price= models.DecimalField(default='0.0', max_digits=10, decimal_places=2)
    sold_amount = models.IntegerField(default='0', blank=True, null=True)
    sales_volume =  models.DecimalField(default='0.0', max_digits=10, decimal_places=2)


    def __str__(self):
        return self.name

0001_initial.py

# Generated by Django 3.2.16 on 2023-01-05 14:33

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='medicament',
            fields=[
                ('PZN', models.CharField(max_length=5, primary_key=True, serialize=False)),
                ('name', models.CharField(max_length=100, verbose_name='Medikament Name')),
                ('description', models.CharField(max_length=500, verbose_name='Medikament   Beschreibung')),
                ('category', models.CharField(default='Allgemein', max_length=100)),
                ('instructionsForUse', models.CharField(max_length=400, verbose_name='Medikament Einnehmhinweise')),
                ('productimage', models.ImageField(blank=True, null=True, upload_to='images/')),
                ('stock', models.IntegerField(default='0')),
            ],
        ),
    ]

解决办法

1. 别盯着0001_initial.py看

初始迁移文件(0001_initial.py)只会在第一次创建模型时生成,后续修改模型(比如加字段)会生成新的迁移文件(比如0002_medicament_reorder_level_price.py这类命名),去你的app下的migrations目录里找最新的文件,别死磕初始文件。

2. 确认你的app在INSTALLED_APPS里注册了

打开项目根目录的settings.py,找到INSTALLED_APPS列表,确保你的app名字在里面,比如:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    '你的app名称',  # 必须加上这行
]

Django只会处理已注册app的模型变化,没注册的话,makemigrations根本不会识别到你的模型修改。

3. 确保在正确的目录执行命令

打开终端,切换到manage.py所在的项目根目录,再执行命令:

py manage.py makemigrations  # 生成新迁移
py manage.py migrate         # 同步到数据库

如果不在根目录,命令会找不到manage.py,或者识别不到app。

4. 检查命令执行的输出

执行makemigrations时,终端应该会输出类似Migrations for '你的app': 0002_xxx.py: - Add field price to medicament - Add field reorder_level to medicament...的内容,如果没有输出,说明Django没检测到模型变化,或者有语法错误。

5. 排查models.py的语法错误

看你的models.py,category_choice的缩进有问题——它在类外面,前面多了4个空格,应该顶格写:

# 修正后(顶格)
category_choice = (
    ('Allgemein', 'Allgemein'),
    ('Erkältung', 'Erkältung'),
    ('Salben & Verbände', 'Salben & Verbände'),
)

语法错误会导致makemigrations失败,终端会报错,先把这个错误改了再试。

6. 开发环境下重置迁移(仅当上面的方法都没用时)

如果迁移状态混乱,可以重置(注意:会清空数据库,只适合开发阶段):

  • 进入你的app下的migrations目录,删除除__init__.py外的所有文件
  • 删除项目根目录下的sqlite数据库文件(一般叫db.sqlite3)
  • 重新执行:
    py manage.py makemigrations
    py manage.py migrate
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:45:37