ORM--一对多-多对多操作-聚合函数

已有模型
在这里插入图片描述

一对多

添加数据

Publish.objects.create(name='北京出版社',address='北京')
Publish.objects.create(name='河南出版社',address='河南')
Publish.objects.create(name='山东出版社',address='山东')

# 第一种
Book.objects.create(name='python基础',publish_id=1)
# 第二种
publish = Publish.objects.get(name='北京出版社')
Book.objects.create(name='python开发',publish_id=publish.id)
# 第三种
publish = Publish.objects.get(name='河南出版社')
Book.objects.create(name='pythonWeb',publish=publish)
# 第四种
Book.objects.create(name='pythonWeb',publish=Publish.objects.get(name='山东出版社'))

# 正向:从外键所在的表到关联表的操作叫正向操作
book = Book()
book.name = 'py数据分析'
book.publish = Publish.objects.get(name='河南出版社')
book.save()

# 反向:从关联表到外键所在的表的操作
publish = Publish.objects.filter(name='山东出版社').first()
publish.book_set.create(name='py爬虫')

# 在创建出版社的时候,直接在后面添加该出版社的书籍
publish = Publish.objects.create(name='河南出版社')
publish.book_set.create(name='py技术')

查询

# 查询北京出版社的书籍
pub = Publish.objects.get(name='北京出版社')
book = Book.objects.filter(publish_id=pub.id).values('name')
book1 = Book.objects.filter(publish=pub).values('name')
print(book,book1)

# 查询python基础的出版社的名字
book = Book.objects.get(name='python基础')
pname = Publish.objects.get(id=book.publish_id)
print(pname.name)

# 正向查询  book->publish
# 查 python基础的出版社信息
book = Book.objects.get(name='python基础')
pub_name = book.publish.name  # book.publish得到的是一个出版社对象
print(pub_name)
pub_id = book.publish_id  # 直接拿book的publish_id就是对应出版社的id
print(pub_id)

# 反向查询:pub-》book
# 查北京出版社的书籍
pub = Publish.objects.get(name='北京出版社')
b_name = pub.book_set.all().values('name')
print(b_name)

修改数据

# 1.save   将python基础的出版社修改为河南出版社
book = Book.objects.get(name='python基础')
pub = Publish.objects.get(name='河南出版社',address='河南')
book.publish = pub
book.save()

# 2.update
pub = Publish.objects.get(name='北京出版社')
Book.objects.filter(name='py爬虫').update(publish = pub)

删除数据

  • 需要先删除外键所在的表,针对现有的表,只能删除书的数据,出版社的不能删
# 删除“python基础”
Book.objects.get(name='python基础').delete()

# 删除关联表  删除py爬虫的对应的出版社信息
book = Book.objects.get(name='py爬虫')
book.delete()

# 删除“py技术”
book = Book.objects.get(name='py技术')  # 实例化py技术这本书
Publish.objects.filter(id = book.publish_id).delete()  # Publish调用delete 方法删除

多对多操作

已有模板
在这里插入图片描述

添加数据

# 增加老师
Teacher.objects.create(name='老张',gender=1)
Teacher.objects.create(name='老王',gender=1)
Teacher.objects.create(name='老李',gender=1)
Teacher.objects.create(name='丽丽',gender=0)

# 增加学生
Student.objects.create(name='张一',age=21,gender=1)
Student.objects.create(name='张二',age=22,gender=1)
# 正向添加:王一想上老王的课
teacher = Teacher.objects.get(name='老王')  # 先实例化老师对象
teacher.student.create(name='王一',age=23,gender=1)  # 老师.学生.create方法
# 正向添加:小三和小四想上女老师的课
teacher = Teacher.objects.get(gender=0)  # 实例化老师对象
student1 = Student.objects.create(name='小三',age=31,gender=1)  # 实例化多个学生对象
student2 = Student.objects.create(name='小四',age=22,gender=0)
teacher.student.add(student1,student2)  # 老师.学生.add方法(学生1,学生2)
# 反向添加:小五想上老李的课
student = Student.objects.create(name='小五',age=25,gender=1)  # 实例化学生对象
teacher = Teacher.objects.filter(name='老李').first()  # 实例化老师对象
student.teacher_set.add(teacher)  # 学生.老师_set.add方法(老师)

查询数据

# 正向查询:老张的学生都有谁
teacher = Teacher.objects.filter(name='老张').first()  # 实例化老师对象
student = teacher.student.all().values('name')  # 老师.学生.all().values()
print(student)

# 反向查询:丽丽的学生都有谁
student = Student.objects.filter(name='小三').first()  # 实例化学生对象
teacher = student.teacher_set.all().values('name')  # 学生.老师_set.all().values(属性关键字)
print(teacher)

修改数据

  • 正向修改数据的时候用 set()方法
  • 反向修改数据的时候使用 _set()方法
  • 括号里面可以放多个对象,也可以是 [ id1 , id2 , id3 ]
# 正向
# 把学生id为3,4,5的学生老师都换成丽丽
teacher = Teacher.objects.get(name='丽丽')  # 实例化老师对象
teacher.student.set([3,4,5])  # 

# 反向
# 给小三选上老师id为1,2,3,4的课
student = Student.objects.get(name='小三')
student.teacher_set.set([1,2,3,4])

删除数据

  • remove 删除关系
  • remove() 可以加id,也可以加对象
  • clear 清空所有的关系
  • delete 删除数据之后,对应的关系表里的关系也没有了
# 正向:解除小四和丽丽的关系
# 正向删除的时候,直接调用remove方法
teacher = Teacher.objects.get(name='丽丽')
student = Student.objects.get(name='小四')
teacher.student.remove(student)
# 反向:解除丽丽和小三的关系
# 反向删除的时候,加个_set 再用remove 方法
teacher = Teacher.objects.get(name='丽丽')
student = Student.objects.get(name='小三')
student.teacher_set.remove(teacher)

# clear  清空
# 反向:删除张一和所有老师的关系
Student.objects.get(name='张一').teacher_set.clear()
# 正向:删除老张和所有学生的关系
teacher = Teacher.objects.get(name='老张')
teacher.student.clear()

# delete  删除数据
Student.objects.filter(name='王一').delete()

聚合函数

  • 先导包:from django.db.models import Sum,Avg,Count,Max,Min,F
# 返回值是个字典:默认key的格式(参数名_聚合函数名)
dict1 = Student.objects.all().aggregate(Count('id'), Count('name'), Avg('age'))
# print(dict1)

# 给聚合函数返回值的 key 改名字
dict2 = Student.objects.aggregate(name=Count('name'))
# print(dict2)
# 在使用聚合函数的前面加上要改的名字     新名字 = Count('name')

# F 对象,用来比较一个表中的两个字段的值的大小
data = Book.objects.filter(num__lt = F('sell_num')).all().values('name')
# print(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值