python django开发新闻聚合检索推荐_Django之聚合查询、分组查询、查询优化以及F、Q查询...
目 录
前言:以下操作的数据库表模型如下(app01下的models.py):
from django.db importmodels#Create your models here.
#自定义char类型
classMyCharField(models.Field):def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
super().__init__(max_length=max_length,*args,**kwargs)defdb_type(self, connection):return 'char(%s)'%self.max_length'''建表时,要注意先将主表建好,在建立表关系'''
classBook(models.Model):
title= models.CharField(max_length=32)
price= models.DecimalField(max_digits=8, decimal_places=2)
publish_date=models.DateField()
maichu= models.IntegerField(default=1000)
kucun= models.IntegerField(default=1000)#书籍和出版社是一对多的关系,外键建在多的一方
publish = models.ForeignKey(to='Publish')#书籍和作者是多对多的关系,需要第三张表
authors = models.ManyToManyField(to='Author')def __str__(self):returnself.titleclassPublish(models.Model):
name= models.CharField(max_length=32)
addr= models.CharField(max_length=255)def __str__(self):returnself.nameclassAuthor(models.Model):
name= models.CharField(max_length=32)
age=models.IntegerField()
hobby= MyCharField(max_length=32,default='read')#作者和作者详情是一对一的关系,外键建立在查询频率高的一方
author_detail = models.OneToOneField(to='AuthorDetail')def __str__(self):returnself.nameclassAuthorDetail(models.Model):
phone=models.BigIntegerField()
addr= models.CharField(max_length=64)def __str__(self):return self.addr
models.py
一、聚合查询
聚合函数:在已经搭建好测试环境的tesy.py中导入聚合函数
from django.db.models import Max,Min,Sum,Count,Avg
"""聚合查询
关键字:aggregate"""
from django.db.models importMax,Min,Count,Sum,Avg#统计所有书平均价格
#res = models.Book.objects.all().aggregate(Avg('price'))
#res1 = models.Book.objects.all().aggregate(Max('price'))
#res2 = models.Book.objects.all().aggregate(Min('price'))
#res3 = models.Book.objects.all().aggregate(Sum('price'))
#res4 = models.Book.objects.all().aggregate(Count('title'))
#res5 = models.Book.objects.all().aggregate(Avg('price'),Max('price'),Min('price'),Sum('price'),Count('title'))
#print(res5)
二、分组查询
"""分组查询
关键字:annotate"""
#1.统计每一本书的作者个数
#res = models.Book.objects.annotate(author_num = Count('authors')).values('author_num')
#print(res)
#2.统计出每个出版社卖的最便宜的书的价格
#res = models.Publish.objects.annotate(price_min=Min('book__price')).values('price_min')
#print(res)
#3.统计不止一个作者的图书
"""1.统计每本书对应的作者个数
2.基于上面的结果 筛选出作者个数大于1 的"""
#res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('author_num')
#print(res)
#4.查询各个作者出的书的总价格
#res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('sum_price')
#print(res)
三、F、Q查询
F查询
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
"""F与Q查询
我们之前在查询数据库的时候条件都是我们自己手写的
但是现在出现了条件是从数据库里面获取的"""
#F
from django.db.models importF,Q#1.查询出卖出数大于库存数的书籍
#res = models.Book.objects.filter(maichu__gt=F('kucun'))
#print(res)
#2.将所有的书的价格 全部提高100块
#models.Book.objects.update(price=F('price') + 100)
#3.了解 尝试着将所有的书的名字后面都加上 爆款
F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
基于此可以对表中的数值类型进行数学运算,如:将所有书的价格提高100元钱
Q查询
filter() 等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
对条件包裹一层Q时候,filter即可支持交叉并的比较符(即‘与’ ‘或’ ‘非’ 等关系运算)
"""Q查询"""
#1.查询书籍名称是python入门或者价格是544.44的书
#res = models.Book.objects.filter(title='python入门',price=544.44)
#res = models.Book.objects.filter(Q(title='python入门'),Q(price=544.44)) # 逗号就是and
#res = models.Book.objects.filter(Q(title='python入门')|Q(kucun=666)) # 用来Q之后 就能够支持|表示或
#res = models.Book.objects.filter(~Q(title='python入门')|Q(kucun=666)) # esc下面那个键 波浪号 表示非
#print(res)
#Q查询进阶用法 用Q产生对象 然后再使用
#q = Q()
#q.connector = 'or'
#q.children.append(('title__icontains','p'))
## q.children.append(('kucun',666))
#res = models.Book.objects.filter(q)
#print(res)
"""字符串的左边 跟你的变量名条件书写一模一样"""
我们可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。
同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。
示例:
查询 库存数是100 并且 卖出数不是0 的产品
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))
四、自定义char字段
#自定义char类型字段
classMyCharField(models.Field):def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
super().__init__(max_length=max_length,*args,**kwargs)defdb_type(self, connection):return 'char(%s)'%self.max_length
运用自定义的char定义模型表的‘info’字段:
classBook(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)
info= MyCharField(max_length=32,null=True)
maichu= models.IntegerField(default=1000)
kucun= models.IntegerField(default=1000)#书籍与出版社 是一对多关系
publish = models.ForeignKey(to='Publish')#书籍与作者 是多对多
authors = models.ManyToManyField(to='Author')"""authors虚拟字段
1.告诉orm自动帮你创建第三张关系表
2.orm查询的时候 能够帮助你更加方便的查询"""
五、查询优化(*****面试重点)
查询优化(面试比较喜欢问的)
only与defer
select_related和prefetch_related
代码示例:
#惰性查询
#res = models.Book.objects.all()
#res = models.Book.objects.values('title')
#res = models.Book.objects.only('title')
#for r in res:
## print(r.title)
#print(r.price)
"""only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库
一旦你点了不是括号内的字段 就会频繁的去走数据库查询"""
#res = models.Book.objects.defer('title') # defer和only互为反关系
#for r in res:
#print(r.title)
"""defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询"""
#res = models.Book.objects.select_related('publish')
#res1 = models.Author.objects.select_related('author_detail')
## res = models.Book.objects.all()
#for r in res1:
#print(r.author_detail)
#print(r.author_detail.phone)
#print(r.author_detail.addr)
"""select_related 会自动帮你做连表操作 然后将连表之后的数据全部查询出来封装给对象
select_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)"""
#prefetch_related
res = models.Book.objects.prefetch_related('publish')#print(res)
for r inres:print(r.publish.name)"""prefetch_related 看似连表操作 其实是类似于子查询
prefetch_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)"""
"""第一个 内部自动连表 消耗的资源就在连表上 但是走数据库的次数较少
第二个 内部不做连表 消耗的资源就在查询次数上 但是给用户的感觉跟连表操作一样"""
六、Django ORM中的事务操作
数据库中事务的4大特性,ACID:原子性、一致性、隔离性、持久性。
事务的提交:commit
事务的回滚:rollback
#django中如何开启事务
from django.db importtransaction
with transaction.atomic():#在该代码块中所写的orm语句 同属于一个事务
#缩进出来之后自动结束
七、案例--图书管理系统
开启一个Django项目,需要注意事项:
1、首先在Navacat中建好数据库并在应用文件夹下的init.py文件中导入pymysql,在应用models.py 下建好模型表;
2、然后在settings.py文件下进行静态文件配置,在跟目录下创建static文件夹,放置bootstraip文件;
3、在templates文件夹中创建HTML文件时,注意配置{% load static%} link script 等配置代码;
4、POST提交请求时,注意要在settings.py文件中注释CRSF...中间件
代码如下:
app01文件夹:
importpymysql
pymysql.install_as_MySQLdb()
init.py
from django.db importmodels#Create your models here.
"""你在写orm语句的时候 跟你写sql语句一样
不要想着一次性写完
写一点查一点看一点"""
#自定义char类型字段
classMyCharField(models.Field):def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
super().__init__(max_length=max_length,*args,**kwargs)defdb_type(self, connection):return 'char(%s)'%self.max_lengthclassBook(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)#info = MyCharField(max_length=32,null=True)
# #maichu = models.IntegerField(default=1000)
#kucun = models.IntegerField(default=1000)
#书籍与出版社 是一对多关系
publish = models.ForeignKey(to='Publish')#书籍与作者 是多对多
authors = models.ManyToManyField(to='Author')"""authors虚拟字段
1.告诉orm自动帮你创建第三张关系表
2.orm查询的时候 能够帮助你更加方便的查询"""
def __str__(self):returnself.titleclassPublish(models.Model):
name= models.CharField(max_length=32)
addr= models.CharField(max_length=64)def __str__(self):returnself.name"""return返回的数据必须是字符串类型"""
classAuthor(models.Model):
name= models.CharField(max_length=32)
age=models.IntegerField()#author_detail = models.ForeignKey(unique=True,to='AuthorDetail')
author_detail = models.OneToOneField(to='AuthorDetail')def __str__(self):returnself.nameclassAuthorDetail(models.Model):
phone=models.BigIntegerField()
addr= models.CharField(max_length=64)def __str__(self):return self.addr
models.py
from django.shortcuts importrender,HttpResponse,redirect,reversefrom app01 importmodels#Create your views here.
defhome(request):return render(request,'home.html')defbook_list(request):#将网站所有的书籍查询出来
book_queryset =models.Book.objects.all()return render(request,'book_list.html',locals())defadd_book(request):if request.method == 'POST':
title= request.POST.get('title')
price= request.POST.get('price')
publish_date= request.POST.get('publish_date')
publish_id= request.POST.get('publish')
authors_list= request.POST.getlist('authors')#操作书籍表
book_obj = models.Book.objects.create(title=title,price=price,publish_date=publish_date,publish_id=publish_id)#操作书籍与作者的关系表
book_obj.authors.add(*authors_list)#跳转到展示页面
_url = reverse('list')returnredirect(_url)#把出版社和作者全部查询出来
publish_queryset =models.Publish.objects.all()
authors_queryset=models.Author.objects.all()return render(request,'add_book.html',locals())defedit_book(request,edit_id):#获取到用户想要编辑的数据的主键值
edit_obj = models.Book.objects.filter(pk=edit_id).first()if request.method == 'POST':
title= request.POST.get('title')
price= request.POST.get('price')
publish_date= request.POST.get('publish_date')
publish_id= request.POST.get('publish')
authors_list= request.POST.getlist('authors')
models.Book.objects.filter(pk=edit_id).update(title=title,price=price,publish_date=publish_date,publish_id=publish_id)
edit_obj.authors.set(authors_list)#跳转到书籍的展示页面
_url = reverse('list')returnredirect(_url)#将用户想要编辑的数据对象 展示给用户看
#把出版社和作者全部查询出来
publish_queryset =models.Publish.objects.all()
authors_queryset=models.Author.objects.all()return render(request,'edit_book.html',locals())defdelete_book(request,delete_id):
models.Book.objects.filter(pk=delete_id).delete()return redirect(reverse('list'))
views.py
BMS文件夹:
"""Django settings for BMS project.
Generated by 'django-admin startproject' using Django 1.11.11.
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/"""
importos#Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#Quick-start development settings - unsuitable for production#See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
#SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ')9mson%8(483jjy+sof)83k$q%6!$r-9pwwjx+(dmestlf_-s4'
#SECURITY WARNING: don't run with debug turned on in production!
DEBUG =True
ALLOWED_HOSTS=[]#Application definition
INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config',
]
MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF= 'BMS.urls'TEMPLATES=[
{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')]
,'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION= 'BMS.wsgi.application'
#Database#https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES={'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'day61','USER': 'root','PASSWORD': "root",'HOST': '127.0.0.1','PORT': 3306,'CHARSET': 'utf8'}
}#Password validation#https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS=[
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]#Internationalization#https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE= 'en-us'TIME_ZONE= 'UTC'USE_I18N=True
USE_L10N=True
USE_TZ=True#Static files (CSS, JavaScript, Images)#https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL= '/static/'STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]
settings.py
"""BMS URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))"""
from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews
urlpatterns=[
url(r'^admin/', admin.site.urls),#图书管理系统首页
url(r'^$', views.home),#图书展示页面
url(r'^book_list/', views.book_list,name='list'),#图书的添加页面
url(r'^add_book/',views.add_book,name='add'),#图书的编辑页面
url(r'^edit_book/(\d+)/',views.edit_book,name='edit'),#图书的删除页面
url(r'^delete_book/(\d+)/',views.delete_book,name='delete')
]
urls.py
static文件夹:
存放bootstraip文件
templates文件夹:
{% extends 'home.html' %}
{% block content %}添加页面
title:
price:
publish_date:
publish:
{# 将当前网站所有的出版社 展示给用户看#}{% for publish_obj in publish_queryset %}{{ publish_obj.name }}{% endfor %}
authors:
{# 将当前网站所有的作者 展示给用户看#}{% for author_obj in authors_queryset %}{{ author_obj.name }}{% endfor %}
{% endblock %}
add_book.html
{% extends 'home.html' %}
{% block content %}图书列表
添加书籍
编号书名价格出版日期出版社作者操作
{% for book_obj in book_queryset %}{{ forloop.counter }}{{ book_obj.title }}{{ book_obj.price }}{{ book_obj.publish_date|date:'Y-m-d' }}{{ book_obj.publish.name }}{% for author_obj in book_obj.authors.all %}
{% if forloop.last %}
{{ author_obj.name }}
{% else %}
{{ author_obj.name }},
{% endif %}
{% endfor %}
编辑
删除
{% endfor %}
{% endblock %}
book_list.html
{% extends 'home.html' %}
{% block content %}编辑页面
title:
price:
publish_date:
publish:
{# 将当前网站所有的出版社 展示给用户看#}{% for publish_obj in publish_queryset %}
{% if edit_obj.publish == publish_obj %}{{ publish_obj.name }}{% else %}{{ publish_obj.name }}{% endif %}
{% endfor %}
authors:
{# 将当前网站所有的作者 展示给用户看#}{% for author_obj in authors_queryset %}
{% if author_obj in edit_obj.authors.all %}{{ author_obj.name }}{% else %}{{ author_obj.name }}{% endif %}
{% endfor %}
{% endblock %}
edit_book.html
Title
{% load static %}
}
Toggle navigation
图书管理系统
python django开发新闻聚合检索推荐_Django之聚合查询、分组查询、查询优化以及F、Q查询...相关推荐
- python django开发新闻聚合检索推荐_Django查询以检索符合相关选项卡上聚合条件的行...
我真的被一个Django查询困住了,希望你有几分钟时间来帮我弄清楚.在 我有一个非常简单的模型:class Task(models.Model): # a tuple representing a s ...
- 【python教程入门学习】必须具备Python Django开发技能
我们都知道Python编程语言的流行程度.在大多数技术公司中,这种语言用于开发应用程序的后端部分.此外,这种语言广泛应用于数据科学.自动化等领域.Django是Python最流行的框架,现在很多应用程 ...
- 使用Python Django开发web应用5 URL映射、模板和视图
版本声明:转载请注明出处.未经允许,禁止商业用途. 使用Python Django开发web应用5 URL映射.模板和视图 ----刘一凡 创建模板 在D:\django\web\blog\中创建te ...
- 使用Python Django开发web应用15 缓存
版本声明:转载请注明出处.未经允许,禁止商业用途. 15 使用Python Django开发web应用 缓存 讲师:刘一凡 第一步: 在settings.py中进行添加 CACHES = { ...
- 使用Python Django开发web应用4 模型和数据库
版本声明:转载请注明出处.未经允许,禁止商业用途. 使用Python Django开发web应用 模型和数据库 ----刘一凡 数据库配置 Django支持很多数据库,官方支持PostgreSQL. ...
- 使用Python Django开发web应用14 静态文件
版本声明:转载请注明出处.未经允许,禁止商业用途. 14 使用Python Django开发web应用 静态文件 讲师:刘一凡 第一步: 准备静态文件,制作图片OurBlog 第二步: 缺省配置下.静 ...
- Django Model各种操作 Meta 常用字段 一对多操作 多对对操作 F Q查询 聚合函数
Model操作 meta源信息 class CLS(models.Model):username = models.CharField(max_length=32)class Meta:db_tabl ...
- python django开发api_基于Django框架开发Restful api
在上篇文章中,我们讲解了restful api的主要概念,让大家有初步的了解.这一篇中,我们将通过python的Django框架,来学习开发restful 架构的接口. 一. 开发环境 开发语言:Py ...
- python django开发工具_Python和Django web开发工具pycharm介绍
今天无意中发现了这个软件,适用了一下不错.PyCharm 具有智能代码编辑器,能理解 Python 的特性并提供卓越的生产力推进工具:自动代码格式化.代码完成.重构.自动导入和一键代码导航等 PyCh ...
- Python+Pyqt5开发日志关键字检索工具
项目测试中可能会涉及到日志安全测试,会检索组件打印的系统日志中是否包含敏感信息,如身份证号码.电话号码,明文密码等信息.正常组件较少,且日志量较少时,可通过将日志下载到本地,再通过Ctrl+F的方式进 ...
最新文章
- 女友问粉丝过万如何庆祝,我发万字长文《保姆级大数据入门篇》感恩粉丝们支持,学姐|学妹|学弟|小白看了就懂
- 识别手写字体app_我如何构建手写识别器并将其运送到App Store
- PHP实现http与https转化[转张宴]
- 小米运动蓝牙耳机重新配对_运动高颜值蓝牙耳机推荐,开学选购蓝牙耳机必备攻略...
- windows server 2003 AD
- 源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
- Java中 equals() 和 == 的区别
- qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...
- 个性屏幕保护程序_Mac高清鸟瞰屏幕保护程序,酷毙了
- c语言写一元一次函数图像,一元一次函数练习题带答案.doc
- 为什么我建议每个开发人员都需要学Python?
- Esri中国社区 » GIS大讲堂:ArcGIS Server .Net ADF中的AJAX
- 微型计算机原理 考试试题,微机原理期末考试试题及答案
- Windows 7 杜比软件安装
- java实用工具类——使用java代码实现ftp上传下载工具类
- 【ArcGIS微课1000例】0039:ArcGIS注记转CAD注记的方法
- CSS的一些基础应用
- RAID 磁盘阵列与阵列卡
- Linux vim分屏,如何切换窗口
- linux 无法使用pstree命令