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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:24:30