已有模型
一对多
添加数据
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)