Django修改models.py后0001_initial.py未更新,数据库无变化求助
我是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

