当前位置: 首页 > news >正文

中山的网站建设公司关键词优化排名平台

中山的网站建设公司,关键词优化排名平台,做网站 卖产品,书画院网站建设方案目录 一.多表查询引入 1.数据准备 2.外键的增删改查 (1)一对多外键的增删改查 1.1外键的增加 1.2外键的删除 1.3外键的修改 (2)多对多外键的增删改查 2.1增加 2.2删除 2.3更改 2.4清空 3.正反向概念 二.多表查询 1.子查询(基于…

目录

一.多表查询引入

1.数据准备

2.外键的增删改查

(1)一对多外键的增删改查

1.1外键的增加

1.2外键的删除

1.3外键的修改

(2)多对多外键的增删改查

2.1增加

2.2删除

2.3更改

2.4清空

3.正反向概念

二.多表查询

1.子查询(基于对象的跨表查询)

2.联表查询(基于双下划线的跨表查询)

三.聚合查询

四.分组查询

五.F与Q查询

1.F查询

2.Q查询


一.多表查询引入

1.数据准备

class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField(auto_now_add=True)# 一对多publish = models.ForeignKey(to='Publish')# 多对多authors = models.ManyToManyField(to='Author')class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=64)# 该字段不是给models看的,而是给校验行组件使用的email = models.EmailField()class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()# 一对一author_detail = models.OneToOneField(to='AuthDetail')class AuthDetail(models.Model):phone = models.BigIntegerField()addr = models.CharField(max_length=40)

重载数据库

python36 manage.py makemigrationspython36 manage.py migrate

2.外键的增删改查

(1)一对多外键的增删改查

1.1外键的增加
# (1)一对多的外键的增删改查
# (1.1)外键的增加 - 直接写实际字段
models.Book.objects.create(title="三国演义",price=1369.25,publish_id=1)# (1.2)外键的增加 - 虚拟字段
publish_obj = models.Publish.object.objects.filter(pk=2).first()
models.Book.objects.create(title="红楼梦",price=1569.25,publish=publish_obj)
1.2外键的删除
# (2)一对多的外键删除
models.Publish.objects.filter(pk=1).delete()
1.3外键的修改
# (2)一对多的外键的修改
# - 直接写实际字段
models.Book.object.filter(pk=1).update(publish_id=2)
# - 虚拟字段
publish_obj = models.publish.objects.filter(pk=1).first()models.Book.objects.filter(pk=1).update(publish=publish_obj)

(2)多对多外键的增删改查

多对多 增删改查就是在操作第三张表

2.1增加
# 多对多外键的增删改查 - 就是在操作第三张表
# (1)如何给书籍添加作者
book_obj = models.Book.objects.filter(pk=1).first()
# book_obj.authors - 这样我们就已经能操作第三张关系表了
# 书籍ID为1的书籍绑定了一个主键为1的作者
book_obj.authors.add(1)
# 可以传多个参数
book_obj.authors.add(2,3)
# 支持参数传对象 - 且支持多个对象
book_obj.authors.add(author_obj)
2.2删除

支持多个参数/支持对象

# (2)删除
book_obj = models.Book.objects.filter(pk=1).first()
# 支持多个参数 - 支持多个对象
book_obj.authors.remove(2)
2.3更改

先删除后增加

# (3)修改
book_obj = models.Book.objects.filter(pk=1).first()
# 括号内必须给一个可迭代对象
# 把1删掉,替换成2
book_obj.author.set([1,2])
# 把原来都删掉,替换成3
book_obj.authors.set([3])
# 支持放对象
book_obj.authors.set([author_obj])
2.4清空
# (4)清空
# 在第三张表中清除某一本书和作者的绑定关系
book_obj = models.Book.objects.filter(pk=1).first()
# 不要加任何参数
book_obj.authors.clear()

3.正反向概念

  • 正向
    • 外键字段在我手上,那么我查你就是正向
    • book>>>外键字段在book这边(正向)>>>出版社
  • 反向
    • 外键字段不在我手上,那么我查你就是反向
    • 出版社>>>外键字段在书这边(反向)>>>book
  • 一对一和一对多的判断也是这样

正向查询按字段

反向查询按表名(小写)

二.多表查询

1.子查询(基于对象的跨表查询)

# [1] 基于对象的跨表查询
# (1)查询书籍主键为1的出版社
book_obj = models.Book.objects.filter(pk=1).first()
# 书查出版社 - 正向 - 按字段查
res = book_obj.publish
print(res)  # Publish object
print(res.name)  # 东方出版社
print(res.addr)  # 东方# (2)查询书籍主键为2的作者
book_obj = models.Book.objects.filter(pk=1).first()
# 书查作者 - 正向查询按字段
res = book_obj.authors
print(res)  # app01.Author.None
# 列表中存放的是作者对象
print(res.all())  # <QuerySet [<Author: Author object>]># (3)查询作者 的 电话号码
author_obj = models.Author.objects.filter(name="dream").first()
# 作者查询作者详情 - 正向查询按字段
res = author_obj.author_detail
print(res)  # AuthDetail object
print(res.phone)  # 110
print(res.addr)  # 山东'''在书写ORM语句的时候跟写SQL语句一样的不要企图一次性将ORM语句写完,如果比较复杂,需要写一些看一些正向 什么时候需要加 .all()当查询返回的结果是多个的时候就需要用 .all()当查询的结果只有一个的时候就不需要加'''# (4)查询出版社是东方出版社出版的书
# 先拿到出版社对象
publish_obj = models.Publish.objects.filter(name="东方出版社").first()
# 出版社查书 - 主键字段在书 - 反向查询
res = publish_obj.book_set.all()
# publish_obj.book_set
# print(res) # app01.Book.None
# publish_obj.book_set.all()
print(res)  # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]># (5)查询作者是dream写过的书
# 先拿到作者对象
author_obj = models.Author.objects.filter(name="dream").first()
# 作者查书 - 主键在书 - 反向
res = author_obj.book_set.all()
print(res)  # <QuerySet [<Book: Book object>]># (5)查询手机号是 110的作者姓名
# 先拿到作者详情的对象
author_detail_obj = models.AuthDetail.objects.filter(phone=110).first()
# 详情查作者 - 主键在作者 - 反向
res = author_detail_obj.author
print(res)  # Author object
print(res.name)  # dream'''基于对象 - 反向查询什么时候需要加 _set.all()查询结果是多个的时候需要加查询结果是多个的时候需要加'''

补充:_set.all()(反向查询)

  • 查询结果是多个的时候需要加

2.联表查询(基于双下划线的跨表查询)

# [2] 基于双下划线的跨表查询
# (1)查询dream的手机号和作者的姓名
# 正向:先查询到作者信息再 .value(需要查询信息的表__需要查询的字段,其他字段)
res = models.Author.objects.filter(name="dream").values('author_detail__phone', 'name')
print(res)  # <QuerySet [{'author_detail__phone': 110, 'name': 'dream'}]>
# 反向:先拿到详情,再用作者详情关联作者表,通过 __字段的方法 过滤出我们想要的指定数据
res = models.AuthDetail.objects.filter(author__name="dream").values('phone', 'author__name')
# AuthDetail.objects.filter(author__name="dream")
print(res)  # <QuerySet [<AuthDetail: AuthDetail object>]>
# AuthDetail.objects.filter(author__name="dream").values('phone','author__name')
print(res)  # <QuerySet [{'phone': 110, 'author__name': 'dream'}]># (2)查询书籍主键ID为1的出版社名字和书的名字
# 正向:先过滤出书籍ID为1的书籍对象,再去关联出版者表,利用__字段取值
res = models.Book.objects.filter(pk=1).values('title', 'publish__name')
print(res)  # <QuerySet [{'title': '三国演义', 'publish__name': '东方出版社'}]>
# 反向:先查询到指定出版社,再从出版社反向找到书籍名字
res = models.Publish.objects.filter(book__id=1).values('name', 'book__title')
print(res)  # <QuerySet [{'name': '东方出版社', 'book__title': '三国演义'}]># (3)查询书籍主键ID为1的作者姓名
# 先拿到 书籍主键ID为1的对象,再关联作者信息表,通过__字段取值
res = models.Book.objects.filter(pk=1).values('authors__name')
print(res)  # <QuerySet [{'authors__name': 'dream'}]>
# 反向 : 先拿到 书籍ID为1的作者数据再去取作者的名字
res = models.Author.objects.filter(book__id=1).values('name')
print(res)  # <QuerySet [{'name': 'dream'}]># 查询书籍主键是1的作者的手机号
# book author authordetail
res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
print(res)  # <QuerySet [{'authors__author_detail__phone': 110}]>'''只要掌握了正反向的概念以及双下划线查询就可以无限跨表'''

三.聚合查询

    # 聚合查询# 聚合查询通常情况下都是配合分组一起使用的'''只要是和数据库相关的模块基本上都在 django.db.models 里面如果这里面没有 那大概率可能在 django.db 里面'''from django.db.models import Max, Min, Sum, Count, Avg# (1)所有书的平均价格# 正常情况下,我们是需要 先进行分组再进行 聚合函数运算的# 但是Django给我们提供了一种方法 : aggregate 可以不分组进行某个字段的聚合函数res = models.Book.objects.aggregate(Avg('price'))print(res)  # {'price__avg': 1890.083333}# (2)一次性使用res = models.Book.objects.aggregate(Avg('price'), Max('price'), Min('price'), Sum('price'), Count('pk'))print(res) # {'price__avg': 1890.083333, 'price__max': Decimal('5959.25'), 'price__min': Decimal('555.25'), 'price__sum': Decimal('11340.50'), 'pk__count': 6}

四.分组查询

# 分组查询
'''MySQL中的分组查询分组之后只能获取到分组的依据,组内其他字段都无法获取严格模式中可以修改'''# (1)统计每一本书的作者个数
# models 后面跟的是什么,就是按什么分组
# res = models.Book.objects.annotate()
#
# '''
# author_number 是我们自己定义的字段,用来存储统计出来的每本书的作者个数
# '''
# res = models.Book.objects.annotate(author_number=Count('authors')).values('title','author_number')
# # 等价于
# # res = models.Book.objects.annotate(author_number=Count('authors__pk')).values('title','author_number')
# print(res) # <QuerySet [{'title': '三国演义', 'author_number': 1}, {'title': '红楼梦', 'author_number': 0}, {'title': '水浒传', 'author_number': 0}, {'title': '论语', 'author_number': 0}, {'title': '孙子兵法', 'author_number': 0}, {'title': '镇魂街', 'author_number': 0}]># (2)统计每个出版社最便宜的书的价格
# res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
# print(res) # <QuerySet [{'name': '东方出版社', 'min_price': Decimal('555.25')}, {'name': '北方出版社', 'min_price': Decimal('888.25')}]># (3)统计不止一个作者的图书
# (3.1)先按照图书分组
# (3.2)过滤出不止一个作者的图书
# 我的数据有限,我统计的是大于 0 的作者的图书
# res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=0).values('title',
# '''
# 只要ORM语句得到的是 一个 queryset 对象
#     那么就可以继续无限制的调用封装 的方法
# '''                                                                                              'author_num')
# print(res)  # <QuerySet [{'title': '三国演义', 'author_num': 1}]># (4)查询每个作者出的书的总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name', 'sum_price')
print(res)  # <QuerySet [{'name': 'dream', 'sum_price': Decimal('1369.25')}, {'name': 'hope', 'sum_price': None}, {'name': 'sad', 'sum_price': None}]>'''如果想按照指定的字段分组该如何处理# 如果 annotate 前面没东西 则会按照 Book 分组 ,如果前面有参数 就会按照前面的参数进行分组 pricemodels.Book.objects.values('price').annotate()'''

五.F与Q查询

1.F查询

# F与Q查询from django.db.models import F, Q# (1)查出卖出数大于库存数的书籍
# F 查询 : 帮助我们直接获取到表中的某个字段对应的数据
res = models.Book.objects.filter(sales__gt=F('stock'))
print(res)  # <QuerySet [<Book: 水浒传>]># (2) 将所有书籍的价格提升 50
res = models.Book.objects.update(price=F('price') + 500)
print(res)  # 6 - 影响到了 6 条数据# (3)将所有书的名称后边加上 爆款两个字
# 在操作字符串的时候,F查询不能够直接坐到字符串的拼接
from django.db.models.functions import Concat
from django.db.models import Valueres = models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
print(res) # 6 - 影响到了 6 条数据

2.Q查询

# F与Q查询from django.db.models import F, Q# (1)查询卖出数大于100或者价格小于500的书籍# (1.1)直接使用 filter 查询数据,逗号隔开,里面放的参数是 and 关系
res = models.Book.objects.filter(sales__gt=100, price__lt=500)
print(res)  # <QuerySet []># (1.2)直接使用 Q 查询数据,逗号隔开,里面放的参数还是 and 关系
res = models.Book.objects.filter(Q(sales__gt=100), Q(price__lt=500))
print(res)  # <QuerySet []># (1.3)直接使用 Q 查询数据,逗号可以换成其他连接符达到效果
res = models.Book.objects.filter(Q(sales__gt=100) or Q(price__lt=500))
# 二者等价 (| :或关系) (~  : 取反 not 关系)
res = models.Book.objects.filter(Q(sales__gt=100) | Q(price__lt=500))
print(res)  # <QuerySet [<Book: 三国演义爆款>, <Book: 水浒传爆款>, <Book: 论语爆款>, <Book: 孙子兵法爆款>]># (2) Q的高阶用法 能够将查询条件的左边也变成 字符串形式
# 产生 Q 对象
q = Q()
# 修改Q查询的默认连接条件
q.connector = 'or'
q.children.append('sales', 100)
q.children.append('stock', 600)
# filter 参数支持Q对象,默认还是 and 关系
res = models.Book.objects.filter(q)

http://www.dt0577.cn/news/41274.html

相关文章:

  • 网站建设包含什么浙江疫情最新情况
  • 网站总体设计方案互联网营销公司
  • 太原百度推广制作个性商城网站上海网站推广系统
  • 惠州网站建设推广推广软文200字
  • 好的移动端网站模板下载浏览器下载
  • 写作网站哪个最好平台怎么推广
  • 某某公司网络营销策划书seo方式包括
  • 同一个ip网站太多 seo关键词网站推广
  • 大连网站制作-中国互联吴忠seo
  • 怎么连接网站的虚拟主机自媒体怎么赚钱
  • 高毅资产网站谁做的百度一下你就知道官网网址
  • 网站建设与管理方案书贴吧引流推广
  • 公众号的微网站开发seo怎么做优化工作
  • 网站开发实训内容宁波网络推广优化方案
  • 宁夏网站设计电商网站公司
  • 大气门户网站百度快速收录开通
  • 南山做网站公司怎么选择竞价推广套户渠道商
  • 同一建筑施工企业在12个月内北京seo百度推广
  • 如何做泰国网站北京计算机培训机构哪个最好
  • 阿里云服务器搭建多个网站搜索引擎排名营销
  • 贵州省铜仁市城乡建设局网站企业网络营销系统分析报告
  • 西安植提行业网站建设汕头网站建设方案开发
  • 上海注册公司核名在哪个网站广告公司联系方式
  • 网站的形式站长工具日本
  • wordpress博客没有找到长沙网站优化价格
  • 自定义投票网站怎么做线下推广宣传方式有哪些
  • 如何用电脑做网站关键词你们都搜什么
  • 网页设计网站建设流程优化营商环境 提升服务效能
  • 国外网站空间 月付百度小程序优化排名
  • 网站建设费会计处理高清视频网络服务器