我们都知道生成迁移文件主要是执行两条命令:
// 这里一般都会成功生成迁移文件
python manage.py makemigrations
但是往往我们不是新写的 models模板文件,而是在之前的基础上,新增的各种表,所以才会在生成表的时候,出现各种错误。
- 就像上面的可以看到,生成了 PicTest 和 AreaInfo 两个类的迁移模板类。
- 但是我新写的模板类,只有 PicTest 一个!!注意这是重点!
下面贴出我的 模板文件
from django.db import models
# Create your models here.
class AreaInfo(models.Model):
"""地址模型类"""
# 地区名称
atitle = models.CharField(verbose_name='标题', max_length=20) # 通过verbose_name='标题' ,更改属性显示的标题为 '标题'
# 自关联属性
aParent = models.ForeignKey('self', null=True, blank=True)
def __str__(self):
# django 后台管理中默认显示的是 类名 object ,想要修改就这样:
return self.atitle
def title(self):
return self.atitle
title.admin_order_field = 'atitle' # 使这一列,也具备点击标题进行排序的能力
title.short_description = '地区名称' # 指定标题的名称,不要是默认的 title
def parent(self):
if self.aParent is None:
return ''
return self.aParent
parent.short_description = '父级地区名称'
# 持有这个类是新建的,其他都已经在数据库中生成表了。
class PicTest(models.Model):
"""上传图片"""
goods_pic = models.ImageField(upload_to= 'booktest') # 指定图片上传的位置,以media 目录看起
下面要说的就是,大家要会看报错,出现一堆错误,应该集中注意力到哪里,才能解决问题:
- 首先将注意力集中在箭头所指的地方:
意思就是,你的迁移文件根本没有被迁移!!!注意了,下面说解决方法: - 下面开启数据库,django是如何管理我们的生成文件的呢?
- 注意看这张表
- select * from django_migrations
- 前面的app 就是对应的你的应用的名字,后面的name是它对应的迁移文件
- 当你做迁移时,django会自动的来这个表里面进行比对,当在这个表里面找到对应的app时 ,django就不会再次生成这个迁移文件了!
-
所以重点来了,可以看到我们之前生成的迁移文件,就叫做 0001_initial.py ,此时想要将次迁移文件生成表,就会报错,No migrations to apply!!!,因为已经有一个叫 booktest app 对应着 0001_initial,所以django在你执行生成表命令的时候,默认 0001_initial 迁移文件已经生成过! 所以不会再次帮你生成一次,就会报错,找不到。
- 这个booktest 这是我们之前做迁移文件,留下来的记录!!
解决办法:
- 1. 把对应的迁移文件记录给删除掉
delete from django_migrations wehere id=10; // 这个id 对应自己的记录!!!
-
切记! 哪个冲突删哪个,千万不要不加条件!!把整个表的数据都删除了,清空之后,你在做迁移文件的时候,就会有一堆的错!!!!
- 再次执行生成表的命令:
python mange.py migrate
- 会发现问题解决了:
但是可以看到上面 还有新的错误:下面解决它
- 这个打开迁移文件就可以发现:django给我们生成了两张表模板类,
- 但是我们只定义了一个!! PicTest类,所以,django还想帮我们生成 Booktest_areainfo这张表,但是它已经存在了,就会报这样的错误! 解决方法,删除掉,只留下一个新写的类的迁移文件模板。
- 下面再次执行,生成表,就不会有问题啦!