文章目录
- 一、数据表关系
- 1. 一对一关系
- 2. 一对多关系
- 3. 多对多关系
一、数据表关系
一个模型对应数据库的一张数据表,但是每张数据表之间是可以存在外键关联的,表与表之间有3种关联:一对一、一对多和多对多。
1. 一对一关系
一对一关系存在于两张数据表中,第一张表的某一行数据只与第二张表的某一行数据相关,同时第二张表的某一行数据也只与第一张表的某一行数据相关,这种表关系被称为一对一关系。
在模型中可以通过OneToOneField
来构建数据表的一对一关系,代码如下:
# models.pyclass UserProfile(models.Model):user = models.OneToOneField(User, on_delete=models.CASCADE) # 此处进行了用户一对一关系对应bio = models.TextField(max_length=500, blank=True)location = models.CharField(max_length=100, blank=True)birth_date = models.DateField(null=True, blank=True)def __str__(self):return f'{self.user.username}\'s profile'class User(models.Model):username = models.CharField(max_length=100)email = models.EmailField()date_joined = models.DateTimeField(auto_now_add=True)def __str__(self):return self.username
2. 一对多关系
一对多关系存在于两张或两张以上的数据表中,第一张表的某一行数据可以与第二张表的一到多行数据进行关联,但是第二张表的每一行数据只能与第一张表的某一行进行关联。
这种表关系在日常开发中最为常见。在模型中可以通过ForeignKey
来构建数据表的一对多关系,代码如下:
# models.pyclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE) # 此处与作者模型建立了一对多关系published_date = models.DateField()def __str__(self):return self.title
3. 多对多关系
多对多关系存在于两张或两张以上的数据表中,第一张表的某一行数据可以与第二张表的一到多行数据进行关联,同时第二张表中的某一行数据也可以与第一张表的一到多行数据进行关联。
注意: 数据表之间创建多对多关系时,只需在项目里定义两个模型对象即可,在执行数据迁移时,Django自动生成3张数据表来建立多对多关系。
在模型中可以通过ManyToManyField来构建数据表的多对多关系,代码如下:
# models.pyclass Student(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Course(models.Model):name = models.CharField(max_length=100)students = models.ManyToManyField(Student) # 在这个地方建立了与student模型的多对多关系def __str__(self):return self.name
综上所述,模型之间的关联是由OneToOneField
、ForeignKey
和ManyToManyField
外键字段实现的,每个字段设有特殊的参数,常见参数说明如下:
参数 | 说明 |
---|---|
to | 必选参数,关联的模型名称。 |
on_delete | 必选参数,设置数据的删除模式,删除模型包括:CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET和DO_NOTHING。 |
limit_choices_to | 设置外键的下拉框选项,用于模型表单和Admin后台系统。 |
related_name | 用于模型之间的关联查询,如反向查询。 |
related_query_name | 设置模型的查询名称,用于filter或get查询,若设置参数related_name,则以该参数为默认值,若没有设置,则以模型名称的小写为默认值。 |
db_table | 仅限于ManyToManyField,为管理和存储多对多关系的数据表设置表名称。 |