当你在django中配置完数据库时,肯定要在models.py
文件中创建数据库表的结构。当然,建单表肯定是好建的,关键是数据为一对多或多对多的时候,建立的表就麻烦些。
外键的调用
比如我要建个book表和一个Publisher表,我们知道,一本书只能由一个出版社出版,而一个出版社可以出多本书,所以书和出版社之间存在一对多的关系。所以我可以这样写
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名称")
address = models.CharField("地址", max_length=50)
city = models.CharField('城市',max_length=60)
class Book(models.Model):
title = models.CharField(max_length=100)
# django 2.0后,添加外键时要再加一个on_delete参数才可以,
# on_delete有多少个选项呢:
#CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
#PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
#SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
#SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
因为一个出版社对应多本书,所以书是多的那一方,所以要把外键放到书的那个表中。
多对多建立数据表
当我再添加一个作者表的时候,因为一本书可以有多个作者,而一个作者可以写多本书,所以书和作者之间存在多对多的关系。我可以这样写
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
# 这个多对多关系写到哪个表中都可以
authors = models.ManyToManyField(Author)
这样,基本的一对多和多对多数据表就创建完成了。