Django ORM关系字段的CRUD

一、关系字段
1.一对多
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多’中’多’的一方。
例如:一个学科对应多个学生,一个学生对应一个学科。
在这里插入图片描述
字段: ForeignKey
to : 设置要关联的表。
to_field : 设置要关联的表的字段。 默认关联的是表的id。
如果想关联其他字段名称可以使用此字段。
on_delete: 当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE :删除关联数据,与之关联也删除。
models.DO_NOTHING:删除关联数据,引发错误IntegrityError。
models.PROTECT: 删除关联数据,引发错误ProtectedError。

(1)增
使用 create() 、save() 方法。
练习1: 新增学员赵四 学python 学科
反向操作: create()
sub_obj = models.Subject.objects.get(name=‘python’)
sub_obj.student_set.create(name=‘赵四’, age=23)
正向操作: save()
sub_obj = models.Subject.objects.get(name=‘python’)
student_obj = models.Student()
student_obj.name = ‘赵四1’
student_obj.age = 31
student_obj.subject = sub_obj
student_obj.save()
(2)删
delete()方法

(1). 赵四退学
models.Student.objects.get(name=‘赵四’).delete()
(2). python 解散,(级联删除对应的学生)
models.Subject.objects.get(name=‘python’).delete()
delete()方法

(3)改
set()、save()、update() 方法。
1、反向操作:(使用set() 方法)
练习1:将赵四 修改成学java
sub_obj = models.Subject.objects.get(name=‘java’)
student_obj = models.Student.objects.get(name=‘赵四’)
sub_obj.student_set.set([student_obj])

可以修改多个学生对象。

2、正向操作:(使用save()、update()方法)
(1).使用save()
练习1:李四转学python
student_obj = models.Student.objects.get(name=‘李四’)
sub_obj = models.Subject.objects.get(name=‘python’)
student_obj.subject = sub_obj
student_obj.save()
(2).使用update() --> 比save()操作简单。
练习1:李四转学java
sub_obj = models.Subject.objects.get(name=‘java’)
models.Student.objects.filter(name=‘李四’).update(subject=sub_obj)
(4)查
(1).正向查询 张三的学科
# student_obj = models.Student.objects.get(name=‘张三’)
# subject_obj = student_obj.subject # 直接是对象
# print(subject_obj)
(2).反向查询 python学科对应的学生
# subject_obj = models.Subject.objects.get(name=‘python’)
# student_obj_list = subject_obj.student_set.all()
#print(student_obj_list)
#<QuerySet [<Student: name:张三>, <Student: name:李四>]>
2.多对多
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。
字段: ManyToManyField
字段参数to: 设置要关联的表
注意: 正向查询和反向查询同一对多规则。

例如:一个老师对应多个学生,一个学生对应多个老师。
在这里插入图片描述
(5)增
create():创建新的对象并且自动设置关系。
add():对象先存在,然后再设置关系。
1.create()
# 新学员 阿三 跟 波波老师学习
# teacher_obj = models.Teacher.objects.get(name=‘波波’)
# subject_obj = models.Subject.objects.get(name=‘python’)
#teacher_obj.student.create(name=‘阿三’, age=14, subject=subject_obj)
#subject属性设置对象
#teacher_obj.student.create(name=‘阿四’, age=14, subject_id=2)
#subject_id属性设置 id
2.add()
正向:
# teacher_obj = models.Teacher.objects.get(name=‘波波’)
# student_obj = models.Student()
# student_obj.name = ‘张三’
# student_obj.age = 22
# student_obj.subject_id = 2
# student_obj.save()
# teacher_obj.student.add(student_obj)
扩展:add() 方法可以添加多个关系–>>阿五和波波学了又和老王学
# teacher_obj = models.Teacher.objects.get(name=‘老王’)
# student_obj = models.Student.objects.get(name=‘阿五’)
#teacher_obj.student.add(student_obj)
#提示可以添加多个对象,或者添加多个对象id
# teacher_obj.student.add(student_obj,student_obj2,…)
# teacher_obj.student.add(1,2,3,4,…)
反向:
# teacher_obj = models.Teacher.objects.get(name=‘老王’)
# student_obj = models.Student()
# student_obj.name = ‘李四’
# student_obj.age = 11
# student_obj.subject_id = 2
# student_obj.save()
# student_obj.teacher_set.add(teacher_obj)
(6)删
remove():解除某个对象之间的关系
clear() :清除某个对象关联的所有关系
delete():删除某个对象及其对应的关系

1.remove(): 解除关系
正向操作:
练习1:阿五不和 老王学
teacher_obj = models.Teacher.objects.get(name=‘老王’)
student_obj = models.Student.objects.get(name=‘阿五’)
teacher_obj.student.remove(student_obj) # 也可以根据id 删除
反向操作:
teacher_obj = models.Teacher.objects.get(name=‘波波’)
student_obj = models.Student.objects.get(name=‘张三’)
student_obj.teacher_set.remove(teacher_obj)
2.clear()
正向操作:
老王高升了
teacher_obj = models.Teacher.objects.get(name=‘老王’)
teacher_obj.student.clear()
反向操作:
张三休学了
student_obj = models.Student.objects.get(name=‘张三’)
student_obj.teacher_set.clear()
3.delete()
王五退学
models.Student.objects.get(name=‘张三’).delete()
老王离职了
models.Teacher.objects.get(name=‘老王’).delete()
(7)改
set(): 将某个对象的关系修改为 指定的关系(以前的关系会被删除)
正向操作:
老王 现在只教id 为 15,16 的对象
teacher_obj = models.Teacher.objects.get(name=‘老王’)
teacher_obj.student.set([15, 16])
提示:也可以是对象
teacher_obj.student.set([obj1,obj2,obj3…])
反向操作:
王五想和波波和老王学习
student_obj = models.Student.objects.get(name=‘王五’)
student_obj.teacher_set.set([2, 3])
(8)查
正向: 波波老师 教过的学生
# teacher_obj = models.Teacher.objects.get(name=‘波波’)
# student_obj_list = teacher_obj.student.all()
# <QuerySet [<Student: name:张三>, <Student: name:李四>]>
# print(student_obj_list)
反向: 查询 张三 被哪些老师教过
# student_obj = models.Student.objects.get(name=‘张三’)
# teacher_obj_list = student_obj.teacher_set.all()
# print(teacher_obj_list)
# <QuerySet [<Teacher: name:波波>]>
二、跨关系查找
Django 提供了强大而直观的关系查找方式,在背后会自动执行 SQL JOIN 查询。若想跨关系,只需使用两个下划线连接各模型中的字段名称,直到得到所需的字段为止。
在这里插入图片描述
三、终端打印SQL语句
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值