网站内怎么做搜索,网页微信截图快捷键,广州网站优化哪家快,网络广告推广服务系列文章目录
Django入门全攻略#xff1a;从零搭建你的第一个Web项目Django ORM入门指南#xff1a;从概念到实践#xff0c;掌握模型创建、迁移与视图操作Django ORM实战#xff1a;模型字段与元选项配置#xff0c;以及链式过滤与QF查询详解Django ORM深度游#xff…
系列文章目录
Django入门全攻略从零搭建你的第一个Web项目Django ORM入门指南从概念到实践掌握模型创建、迁移与视图操作Django ORM实战模型字段与元选项配置以及链式过滤与QF查询详解Django ORM深度游探索多对一、一对一与多对多数据关系的奥秘与实践还在写0.0… 文章目录 系列文章目录前言一、多对一关系1.多对一关系是什么2.多对一关系的增删改操作3.多对一的正向查询4.多对一的反向查询 二、一对一关系1.一对一关系是什么2.一对一关系的增删改操作3.一对一关系正向查询4.一对一关系反向查询 三、多对多关系1.多对多关系是什么2.多对多关系的外键添加操作3.多对多关系的外键移除工作4.多对多关系的修改和查询 前言 在Django开发中数据关系的管理至关重要。今天我们将快速了解Django ORM如何处理多对一、一对一和多对多这三种核心数据关系。这些基础知识将帮助你更高效地构建数据库驱动的应用。让我们一起探索Django ORM的奥秘吧 一、多对一关系
1.多对一关系是什么 Django使用django.db.models.ForeignKey定义多对一关系。 博客表—用户表 - - - 多对一 # app/model.py
class UserModel(models.Model):name models.CharField(max_length50)age models.IntegerField()height models.DecimalField(max_digits3, decimal_places2)def __str__(self):return self.nameclass Meta:db_table usersclass BlogModel(models.Model):title models.CharField(max_length100)content models.TextField()pub_date models.DateField()address models.CharField(max_length50)user models.ForeignKey(toUserModel, on_deletemodels.CASCADE)def __str__(self):return self.titleclass Meta:db_table blogs2.多对一关系的增删改操作
增 # 1.添加useru1 UserModel.objects.create(name王五, age18, height1.78)# 2.为 idpk 1的用户添加blogu2 UserModel.objects.get(pk1)blog BlogModel()blog.title ORM关联模型blog.content 多对一、一对一、多对多模型blog.pub_date 2024-05-31blog.address csdnblog.user u2blog.save()改 # 1.修改用户信息# u3 UserModel.objects.get(id1)# u3.age 100# u3.save()# 2.修改博客信息# b3 BlogModel.objects.get(id9)# b3.address 修改后的CSDN地址b3 BlogModel.objects.filter(id9).update(address再修改(update)后的CSDN地址)# b3.save()删 # 1.删除blog表中的记录直接删除# blog BlogModel.objects.get(pk10)# blog.delete()# 2.删除user表中数据,此user对应的blog也会删除u4 UserModel.objects.get(pk2)u4.delete()3.多对一的正向查询 # 多查询一的情况下直接通过模型类中的外键关联字段查询# 正向查询b5 BlogModel.objects.get(user_id1)print(b5)print(b5.user.name)print(b5.user.age)print(b5.user.height)
ORM关联模型
张安
100
1.96 4.多对一的反向查询 # 反向查询主表通过blogmodel_set查从表u6 UserModel.objects.get(id1)print(u6)b6 u6.blogmodel_set.all()print(b6)for blog in b6:print(blog.title)print(blog.content)二、一对一关系
1.一对一关系是什么 模型类使用OneToOneField用来定义一对一关系 学生表与学生信息表 - - - 一对一 models.CASCADE多表关联 删除数据的时候 一删就全删 #app/model.py
class StudentModel(models.Model):name models.CharField(max_length50)age models.IntegerField()height models.DecimalField(max_digits3, decimal_places2)def __str__(self):return self.nameclass Meta:db_table studentsclass StuDetail(models.Model):address models.CharField(max_length50)idcard models.CharField(max_length50)outlook models.CharField(max_length50)student models.OneToOneField(toStudentModel, on_deletemodels.CASCADE)def __str__(self):return self.idcardclass Meta:db_table detail其中ON DELETE 和 ON UPDATE 表示事件触发限制各参数意义如下
参数意义RESTRICT限制外表中的外键改动默认值也是最安全的设置CASCADE跟随外键改动SET NULL设为null值NO ACTION无动作SET DEFAULT设为默认值
2.一对一关系的增删改操作
增 # 1.增加学生 Studentst1 StudentModel()st1.name 张三三st1.age 18st1.height 1.79st1.save()# 2.增加学生信息 StuDetailsd1 StuDetail()sd1.address 北京sd1.idcard 123sd1.outlook 团员sd1.student st1sd1.save()改 # 3.修改 学生详细信息sd2 StuDetail.objects.get(id1)sd2.address 我在中东吃炸鸡sd2.save()# 4.修改 学生信息st2 StudentModel.objects.get(id1)st2.age 12st2.save()删 # 5.删除st5 StudentModel.objects.get(id1)st5.delete()3.一对一关系正向查询 # 5.正向查询sd3 StuDetail.objects.get(id1)print(sd3.address)print(sd3.idcard)print(sd3.outlook)print(sd3.student.name)print(sd3.student.age)4.一对一关系反向查询 # 6.反向查询st4 StudentModel.objects.get(id1)print(st4.name)print(st4.age)print(st4.studetail.address)print(st4.studetail.idcard)print(st4.studetail.outlook)#print(stu.blogmodel_set.all())#注意这是错误的一对一没有_set且全通过小写字段eg:studetailblogmodel_set找到类名 三、多对多关系
1.多对多关系是什么 多对多关系在模型中使用ManyToManyField字段定义 多对多关系可以是具有关联也可以是没有关联所以不需要明确指定on_delete属性 原因在多对多的情况有专门的第三张表存储 对应关系, 表本身并没有字段来存储对应关系此时删除任意数据不影响另一张表数据 电影表与演员表 - - - 多对多 # app/models.py
class ActorModel(models.Model):name models.CharField(max_length50)age models.IntegerField()gender models.CharField(max_length2)def __str__(self):return self.nameclass Meta:db_table actorsclass MovieModel(models.Model):name models.CharField(max_length50)mtime models.CharField(max_length50)info models.CharField(max_length50)actors models.ManyToManyField(toActorModel)def __str__(self):return self.nameclass Meta:db_table movies2.多对多关系的外键添加操作
创建 # 1.添加演员a1 ActorModel()a1.name 刘海柱a1.age 32a1.gender 男a1.save()#a2 ActorModel()a2.name 赵小刀a2.age 30a2.gender 女a2.save()#a3 ActorModel()a3.name 哈士奇a3.age 33a3.gender 男a3.save()-------------------------------------------# 2.添加电影信息m1 MovieModel()m1.name 精武门m1.mtime 2hm1.info 这是一个武打片m1.save()m2 MovieModel()m2.name ye邪不压正m2.mtime 2h30minm2.info 这肯呢个肯呢个可能是一个武打片m2.save()m3 MovieModel()m3.name don东北黑道纷纭m3.mtime 2h50minm3.info 黄及哦啊哦写m3.save()增加 # 3.给电影添加演员--正向的a1 ActorModel.objects.get(id1)a2 ActorModel.objects.get(id2)a3 ActorModel.objects.get(id3)# 给任意一个电影添加对应的演员m1 MovieModel.objects.get(id1)m1.actors.add(a1)m1.actors.add(a2)m1.actors.add(a3)
---------------------------------------------# 4.给演员安排几个电影拍m2 MovieModel.objects.get(id2)m3 MovieModel.objects.get(id3)a1 ActorModel.objects.get(id1)a1.moviemodel_set.add(m2,m3)3.多对多关系的外键移除工作 多对多关联字段的删除要使用remove来进行关系的断开 而不是直接使用deleteremove只会断开数据之间的联系但是不会将数据删除 # 5.删除会删除电影及电影-演员表中的对应关系# MovieModel.objects.get(id1).delete()# 6.删除对应关系从某电影m6中移除某演员a1只影响演员-电影对应关系表m6 MovieModel.objects.get(id6)a1 ActorModel.objects.get(id1)a1.moviemodel_set.remove(m6)4.多对多关系的修改和查询 # 7.查询数据# 根据任意一个电影查询所有参演的演员-m1 MovieModel.objects.get(id1)print(-*10)print(m1.actors.all())# 根据任意一个演员查询拍过的所有电影 f反向查询a1 ActorModel.objects.get(id1)print(-*10)print(a1.moviemodel_set.all())