Django终端添加数据库条目时报no such table: app1_prices错误
Django 报错
no such table: app1_prices 修复方案 即使执行过makemigrations和migrate仍触发该报错,核心问题有三类,按顺序排查修复即可:
- 迁移文件本身无效,未实际执行建表逻辑
- 模型定义不符合Django规范,导致迁移生成/执行异常
- 模型实例化写法错误,触发非预期问题
1. 修复迁移文件语法错误
你提供的0001_initial.py存在致命缩进问题:initial、dependencies、operations三个迁移核心配置全部顶格编写,不属于Migration类的内部属性,执行migrate时该文件不会产生任何建表效果。
修正后的迁移类代码如下,所有类内部属性必须缩进4个空格:
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name='Figure', fields=[ ('id', models.CharField(max_length=12, primary_key=True, serialize=False)), ('pieces', models.IntegerField()), ], ), migrations.CreateModel( name='Prices', fields=[ ('id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='app1.figure')), ('price_new', models.DecimalField(decimal_places=2, max_digits=8)), ('price_used', models.DecimalField(decimal_places=2, max_digits=8)), ('date', models.DateField(blank=True, null=True)), ], ), ]
如果是测试环境无存量数据,直接删除app1下migrations文件夹内除__init__.py外的所有文件,删除项目根目录的db.sqlite3,重新执行带app名的迁移命令,避免漏处理:
python manage.py makemigrations app1 python manage.py migrate app1
执行前确认app1已经添加到settings.py的INSTALLED_APPS列表中
2. 修正模型定义的不合理写法
当前Prices模型的写法不符合一对多的设计逻辑,还存在隐性bug:
- 把外键字段命名为
id且设为主键:一对多关系下一个Figure可以对应多条价格记录,外键作为主键会限制一个手办只能存一条价格数据,完全违背关联设计初衷。外键应单独命名,主键保留Django默认自增id即可。 __str__方法返回元组:Django要求__str__必须返回字符串类型,返回元组会导致后续访问模型对象时触发类型错误。
修正后的models.py代码:
from django.db import models class Figure(models.Model): id = models.CharField(max_length=12, primary_key=True) pieces = models.IntegerField() def __str__(self): return self.id class Prices(models.Model): # 外键单独命名,配置related_name方便反向查询 figure = models.ForeignKey(Figure, on_delete=models.CASCADE, related_name="prices") price_new = models.DecimalField(decimal_places=2, max_digits=8) price_used = models.DecimalField(decimal_places=2, max_digits=8) date = models.DateField(blank=True, null=True) def __str__(self): return f"{self.figure.id} - {self.date}"
修改完模型后重新执行删除旧迁移、生成并执行新迁移的步骤即可。
3. 修正实例化模型的错误写法
你在shell中传位置参数创建模型实例的写法是错误的,Django模型不支持按字段顺序传位置参数,必须使用关键字参数,外键字段直接传关联模型实例即可,日期字段建议传date类型对象避免格式解析错误:
>>> from app1.models import Figure, Prices >>> from datetime import date >>> f1 = Figure(id="sw0001a", pieces=5) >>> f1.save() >>> p1 = Prices(figure=f1, price_new=2.00, price_used=1.20, date=date(2022, 5, 3)) >>> p1.save()
内容的提问来源于stack exchange,提问作者logan_9997
相关产品推荐
相关产品推荐

