数据表关系
一个模型对应数据库一张数据表,但是每张数据表之间是可以存在外键关联的,表与表之间一共有三种关联:一对一、一对多和多对多。
一对一关系
一对一关系,使用OneToOneField来构建 示例:
models.py文件
from django.db import models
# Create your models here.
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
masterpiece = models.CharField(max_length=50)
class Performer_info(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.OneToOneField(Performer, on_delete=models.CASCADE)
birth = models.CharField(max_length=20)
elapse = models.CharField(max_length=20)
一对多关系
一对多关系存在于两张或两张以上的数据表中,可以通过ForeignKey来构建,示例:
from django.db import models
# Create your models here.
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
class Program(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.ForeignKey(Performer, on_delete=models.CASCADE)
name = models.CharField(max_length=20)
多对多关系
多对多关系存在于两张或两张以上的数据表中,使用ManyToManyField来构建,示例:
from django.db import models
# Create your models here.
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
class Program(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
performer = models.ManyToManyField(Performer)
模型之间的关联是由OnToOneField、ForeignKey和ManyToManyField外键字段实现的,每个字段都有参数,参数说明如下:
- to:必选参数,关联的模型名称
- on_delete:必选参数,设置数据的删除模式,模式包括:CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET和DO_NOTING
- limit_choices_to:设置外键的下拉框选项,用于模型表单和Admin后台系统
- related_name:用于模型之间的关联查询,如反向查询
- related_query_name:设置模型的查询名称,用于filter或get查询,若设置参数related_name,则以该参数为默认值,若没有设置,则以模型的名称小写为默认值。
- to_field:设置外键与其他名字段的关联性,默认关联主键,若要关联其他字段,则该字段必须具有唯一性。
- db_constraint:在数据库里是否创建外键约束,默认值为True
- swappable:设置关联模型的替换功能,默认值为True,比如模型A关联模型B,想让模型C继承并替换模型B,使得模型A与模型C之间关联
- symmetrical:仅限于ManyToManyField,设置多对多字段之间的对称模式
- through:仅限于ManyToManyField,设置自定义模型C,用于管理和创建模型A和B的多对多关系
- through_fields:仅限于ManyToManyField,设置模型C的字段,确认模型C的哪些字段用于管理模型A和模型B的多对多关系
- db_table:仅限于ManyToManyField,为管理和存储多对多关系的数据表设置表名称