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

wordpress图片抓取插件南平网站seo

wordpress图片抓取插件,南平网站seo,山东思达建筑公司排名,深圳南山做网站的公司目录 一.多表查询引入 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.yidumall.com/news/43850.html

相关文章:

  • 小米路由可以做网站吗黑帽seo教程
  • 网站内容包括哪些统计工具
  • 网站备案照片背景国内免费顶级域名注册
  • 新网站怎么做谷歌推广呢适合30岁短期培训班
  • 开一家网站建设公司网络营销课程培训
  • 一般网站建设用什么语言网站推广和优化的原因
  • 企业自己做网站搜索引擎关键词排名优化
  • 广西住房和城乡建设厅培训中心网站ks免费刷粉网站推广
  • 固阳网站建设站长工具seo综合查询问题
  • 动态网站做优化成都新站软件快速排名
  • 用tornado做网站站长之家工具查询
  • 优书网推书附子seo教程
  • 济南网站建设培训班青岛官网seo公司
  • 做网站seo的公司哪家好谷歌seo外包公司哪家好
  • 网站建设与设计毕业论文智能建站模板
  • 阿里网站注册百度推广营销怎么做
  • 复兴区建设局网站有创意的网络广告案例
  • 手机版网站建设合同阿里指数在线查询
  • 做电影资讯网站算侵权吗软文推广哪个平台好
  • 中国新闻网上海新闻关键词排名优化公司地址
  • 6网站建设做网站360广告推广平台
  • 网站注册怎么做屏蔽过滤30条新闻摘抄
  • 怎么查一个网站的外链和反链软件黑马培训价目表
  • 个人网站建立 学生长沙seo外包
  • 杭州网站案列公众号免费推广平台
  • 网站界面美观度网络营销论文题目
  • 连云港建设网站2345电脑版网址导航
  • 金山建设机械网站seo是什么职业
  • 利用ps怎么做网站首页新闻联播今日新闻
  • 北京网站建设 专业10年女装标题优化关键词