Django建外键和多对多数据表

当你在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)

这样,基本的一对多和多对多数据表就创建完成了。

你可能感兴趣的:(Django建外键和多对多数据表)