博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django学习笔记--数据库中的多表操作
阅读量:4632 次
发布时间:2019-06-09

本文共 3980 字,大约阅读时间需要 13 分钟。

1.Django数据库----多表的新增操作

1.一对一模式下新增

创建一个详情对象,把这个对象赋值给创建的新的user对象

author_detail = models.AuthorDetail.objects.create(addr='上海',phone='178****4789')# 直接设置author_detail为一个对象author = models.Author.objects.create(name="zhangsan",age=32,author_detail=author_detail)# 直接设置author_detail_id,或者直接设置她的主键为对应的id,author_detail.pkauthor = models.Author.objects.create(name="李四",age=40,author_detail_id=author_detail.pk)

1.1.删除和修改,直接修改更新

author = models.Author.objects.filter(pk=1).update(author_detail_id=3)

2.一对多的添加

publish = models.Publish.objects.create(name='上海出版社',addr='上海东方明珠',phone='138****9087',email='***080977**@qq.com')book = models.Book.objects.create(name='红楼梦',price=120.00,publish_date='2018-09-10',publish=publish)

3.多对多关系

# 给书添加两个作者book = models.Book.objects.filter(name='红楼梦').first()# 拿到数据模型,add可以传对象也可以传idbook.authors.add(1,3)# 删除书的两个作者 # clear 移除所有的作者book.authors.clear()# remove 移除一个对象,可以传对象或者idbook.authors.remove(3)# 修改对象# 第一种方式  全部删除,在重新添加# 第二种方式  set 参数必须是列表,列表内可以传id或者对象book.authors.set([7,1])

4.基于对象的跨表查询

4.1 跨表查询分为正向和反向,

1.正向---> 关联字段在当前表中,从当前表向外查,叫正向

2.反向---> 关联字段不在当前表中,从当前表向外查,叫反向

4.2 一对一查询,正向查询按字段,反向查询按表名小写

1.正向查询按字段

2.反向查询按表名小写

#正向 ,查询name为张三的人的居住地址author = models.Author.objects.filter(name='张三').first()print(author.author_detail.addr)#反向 查询居住地址为上海的人的名称author_detail = models.AuthorDetail.objects.filter(addr="上海").first()print(author_detail.author.name)# 查询红楼梦的出版社地址book = models.Book.objects.filter(name='红楼梦').first()print(book.publish.addr)
4.3 一对多查询

1.正向查询按字段

2.反向查询按表名小写_set

#北京出版社出版的所有书籍publish = model.Publish.objects.filter(name='北京出版社').first()#books获取到的是一个querySet对象books = publish.book_set.all()#查询红楼梦的所有作者book = models.Book.objects.filter(name='红楼梦').first()authors = book.authors.all()
4.4 多对多查询

1.正向查询按字段

2.反向查询按表名小写_set

#查询张三所写的所有书author = models.Author.objects.filter(name='张三').first()print(author.book.set.all()).first())

5.基于对象的跨表查询是子查询,基于双下划线的查询是连表查询

正向按字段 反向按表名小写,跨表查询,通过一张表获取多个表对应的数据

#一对一查询 跨表查询#查询张三的个人地址addr = models.Author.objects.filter(name='张三').values('name','author_detail__addr').first()res = models.AuthorDetail.objects.filter(author__name="张三").values('addr',author__name)#查询地址为上海的人的名字 反向查询res = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail_addr').first()#正向查询res = models.AuthorDetail.objects.filter(addr='上海').values('addr','author__name').first()# 一对多查询# 查询红楼梦的出版地址res = models.Publish.objects.filter(book__name='红楼梦').values('name','book__name').first()#查询北京出版社出版的书res = models.Book.objects.filter(publish__name='北京出版社').values('name','publish__name').first()# 多对多查询# 跨表查询,Publish  Book  Authors 三张表查询# 查询北京出版社出版过的所有书籍的名字以及作者的名字# book__ 在book这个表中book__authors在authors表中# res = models.Publish.objects.filter(name="北京出版社").values("book__name",'book__authors__name').first()# print(res)# res = models.Book.objects.filter(publish__name="北京出版社").values('name','authors__name').first()# print(res)# res = models.Author.objects.filter(book__publish__name="北京出版社").values('name','book__name')# print(res)

6.F和Q 聚合查询和分组查询

引入对应的模块,aggregate聚合函数

# from django.db.models import  Count,Avg,Max,Min,Sum#  获取图书价格的各种信息# ret = models.Book.objects.all().aggregate(Avg('price'))# ret = models.Book.objects.all().aggregate(Max('price'))# ret = models.Book.objects.all().aggregate(Min('price'))# ret = models.Book.objects.all().aggregate(Count('price'))# ret = models.Book.objects.all().aggregate(Sum('price'))
6.1 F和Q查询

1.F取出表中字段对应的值

2.Q查询的时候构成与或非的关系

在book里面添加评论数和阅读数# from django.db.models import F,Q# 查询评论数大于阅读数的书res = models.Book.objects.filter(commit_num__lt=F('read_num'))# 所有评论数加1ret = models.Book.objects.all().update(commit_num=F("commit_num")+1)# Q构造查询关系# 查询名字为红楼梦的书并且价格为20的书ret = models.Book.objects.filter(name='红楼梦',price=20)ret = models.Book.objects.filter(Q(name='红楼梦')&Q(price=20))# 查询名字为红楼梦的书或价格为20的书ret = models.Book.objects.filter(Q(name='红楼梦')|Q(price=20))# 查询名字不等于红楼梦 取非ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20.0)

转载于:https://www.cnblogs.com/zj901203/p/10967836.html

你可能感兴趣的文章
纠正部分Linux初学者对ctime的误解
查看>>
shell命令快捷键
查看>>
树链剖分(模板)
查看>>
c输出格式
查看>>
mod(%)之规律(除数与被除数的正负分析)
查看>>
C#编程(三十六)----------元组
查看>>
Django 第十课 4.【ORM查询操作】
查看>>
ffmpeg实战系列——001
查看>>
采样器----Debug Sampler
查看>>
ifup / ifdown eth0 / eno1 reports unknown interface when it exists!
查看>>
ListCtrl的多行删除
查看>>
[bzoj2456]mode
查看>>
【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
查看>>
Java中的语法糖
查看>>
Android使用Camera2获取预览数据
查看>>
Shapefile文件格式分析
查看>>
redis初识及基本操作
查看>>
Python 获取计算机全名(fully qualified host name)
查看>>
隐士等待与显示等待
查看>>
【转】html树形菜单控件
查看>>