Django多表实例学习笔记
在按照菜鸟教程学习Django多表实例部分时遇到的问题
表与表之间的关系可分为以下三种:
一对一: 一个人对应一个身份证号码,数据字段设置 unique。
一对多: 一个家庭有多个人,一般通过外键来实现。
多对多: 一个学生有多门课程,一个课程有很多学生,一般通过第三个表来实现关联。
1.创建模型时的问题
接下来我们来看下多表多实例。
实例
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField("Author")
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)
class AuthorDetail(models.Model):
gender_choices = (
(0, "女"),
(1, "男"),
(2, "保密"),
)
gender = models.SmallIntegerField(choices=gender_choices)
tel = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
birthday = models.DateField()
需要注意在创建完模型后,对Database进行更新
python manage.py migrate
python manage.py makemigrations app01 #检测app/models.py文件的改动
python manage.py migrate app01 #把上面的改动翻译成sql语句,然后去数据库中执行
更新时报错,提示一些键值无效,并没有创建对应的表app01_author、app01_authordetail、app01_book、app01_book_authors、app01_publish
2.解决方法
菜鸟教程里的没提,如果是按上一步教程做下来,原先的数据库已经失效
所以不要直接更新数据库,将原先错误的数据库db.sqlite3删除,再更新
python manage.py migrate
python manage.py makemigrations app01 #检测app/models.py文件的改动
python manage.py migrate app01 #把上面的改动翻译成sql语句,然后去数据库中执行
创建完成
进行后续数据插入操作
参考:https://www.runoob.com/django/django-orm-2.html