多对一关系
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
- CASCADE级联,删除主表数据时连通一起删除外键表中数据
- PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
代码:
准备人物列表信息的模型类
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, ‘male’),
(1, ‘female’)
)
name = models.CharField(max_length=20, verbose_name=‘名称’)
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name=‘性别’)
description = models.CharField(max_length=200, null=True, verbose_name=‘描述信息’)
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name=‘图书’) # 外键
is_delete = models.BooleanField(default=False, verbose_name=‘逻辑删除’)
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name
多对一的正向查询
#查询id为2的学生的老师姓名
–找到id为2的学生
stu = Student.objects.get(id=2)
–找到stu对应的老师 stu.teacher.name
stu.外键.name
多对一的反向查询
反向查询:通过django的内置属性来进行查询 模型类(模型类小写)_set()可以反向查询老师名下的所有学生,
# 查询id为1的老师的所有学生 --先找到id为1的老师
tea = Teacher.objects.get(id=1)
–查询tea老师名下的所有学生 老师对象.模型类_set.all()
tea.student_set.all()
一对一关系的增删改操作
代码:
# 正向查询:通过教授,查询对应的讲师信息
>>> p1.teacher
<Teacher: Bob>
一对一关系反向查询
# 反向查询:通过讲师,查询教授信息, 反向查询时,只需要 模型类 本身即可
t1.professor.name
多对多关系
多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定on_delete
属性
多对多关系为什么不需要on_delete属性
在多对多的情况,有专门的第三张表,存储 对应关系, 表本身并没有字段来存储对应关系,此时删除任意数据,不影响另一张表数据
多对多关系的外键添加操作
代码:
添加音乐家语法:
模型类.objects.create()
a1 = Artist.objects.create(artist_name=“朗朗”)
a2 = Artist.objects.create(artist_name=“李健”)
添加乐队语法:
语法:
b1 = Band.objects.create(band_name=“破吉他乐队”)
b2 = Band.objects.create(band_name=“凯乐乐队”)
多对多关系的外键移除操作
多对多关联字段的删除,要使用remove
来进行关系的断开
而不是直接使用delete
,remove
只会断开数据之间的联系,但是不会将数据删除
多对多关系的修改和查询
通过外键查询该乐队的全部音乐家
查看b1乐队的成员
b1.artist.all()
查看b2乐队的成员
b2.artist.all()
反向查询:通过音乐家,查询该音乐家加入的乐队信息
查看a2这个音乐家所属的乐队
a2.band_set.all()
报错
添加实现不出来
解决:
表单没写post请求