目录

1.URL别名&反向解析

2.URL分发&命名空间

3.ORM多表操作-修改

4.ORM多表操作-查询

  4.1 基于对象的跨表查询

  4.2 基于双下划线的跨表查询

  4.3 聚合查询

  4.4 分组查询

  4.5 F查询

  4.6 Q查询

URL别名&反向解析

urls.py的别名写法

from django.conf.urls import url
from django.contrib import admin from app01 import views
from app01 import views
'''给URL起别名,在URL后面加name参数'''
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^book/list/', views.book_list, name='book_list'),
url(r'^book/add/', views.book_add,name='book_add'),
url(r'^book/edit/(\d+)/', views.book_edit, name='book_edit'), # /book/edit/2/
url(r'^book/del/(?P<n>\d+)/', views.book_del,name='book_del'), # /book/edit/2/
]

视图函数部分

from django.urls import reverse

print(reverse('book_list')) #/book/list/
print(reverse('book_edit',args=(2,))) # /book/edit/1/ URL的无名分组参数
print(reverse('book_edit',kwargs={'n': 1,})) # /book/edit/1/ URL的有名分组参数 return redirect('book_list')
'''redirect重定向可以不用写reverse就可以反向解析,因为redirect方法里有reverse方法'''
return redirect(reverse('book_list'))

模板部分

<!-- 无参数的  -->
<a class="btn btn-primary" href="{% url 'book_add' %}">添加书籍</a> <!-- 无名分组参数的 -->
<a href="{% url 'book_edit' books.id 3 4 %}" class="btn btn-warning">编辑</a> <!-- 有名分组 -->
<!-- 以下两种方法都可以 -->
<a href="{% url 'book_del' books.id %}" class="btn btn-danger">删除</a>
<a href="{% url 'book_del' n=books.id %}" class="btn btn-danger">删除</a>

URL分发&命名空间

项目主目录下的urls.py

from django.conf.urls import url, include
from django.contrib import admin from app01 import views '''URL分发使用include方法,命名空间使用namespace属性'''
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls',namespace='app01')),
url(r'^app02/', include('app02.urls',namespace='app02')),
]

app01/urls.py

from app01 import views

urlpatterns = [
url(r'^index/', views.index, name='index'),
url(r'^book/list/', views.book_list, name='book_list'),
url(r'^book/add/', views.book_add, name='book_add'),
url(r'^book/edit/(\d+)/', views.book_edit, name='book_edit'),
url(r'^book/del/(?P<n>\d+)/', views.book_del, name='book_del'),
]

app02/urls.py

from app02 import views

urlpatterns = [
url(r'^index/', views.index, name='index'),
]

app01/views.py

def index(request):
print(reverse('app01:index'))
return HttpResponse('app01的路径:' + reverse('app01:index'))

app02/views.py

def index(requset):
print(reverse('app02:index'))
return HttpResponse('app02的路径: ' + reverse('app02:index'))

ORM多表操作-修改

修改

# 一对一修改和一对多修改
models.Author.objects.filter(name='张三').update(
name='李四',
age=50,
# ad=models.AuthorDetail.objects.get(id=1), 两种方式都可以
ad_id=1,
)
# 多对多修改
obj = models.Book.objects.get(id=2)
obj.authors.set(['',])
'''多对多修改使用set方法 注意:set的值是字符串,set的原理是clear+add'''

Tip:查看和执行原生sql

# 方式1
from django.db import connection
print(connection.queries) # 方式2
'''settings.py文件中配置如下内容'''
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
'''方式1:配置之后,可以使用下面的代码执行sql语句'''
cursor = connection.cursor()
cursor.execute('select * from app01_book;')
print(cursor.fetchall()) '''方式2:也可以使用pymysql执行sql语句''' '''方式3:可以使用objects下的raw方法执行sql语句'''
ret = models.Author.objects.raw('select * from app01_author;') # 注意:只限于本表操作
print(ret)
for i in ret:
print(i.name)

ORM多表操作-查询

基于对象的跨表查询

正向查询和反向查询

正向查询:A表关联了B表,关联属性在A表,那么通过A表数据查询B表中数据时,叫做正向查询

正向查询语法:正向查询使用对象.关联属性名称

反向查询:反之,叫做反向查询

反向查询语法:反向查询使用对象.关联模型类名小写

一对一

'''一对一:正向查询'''
# 查看张三作者的家庭住址 # 1.sql语句查询
select app01_authordetail.addr from app01_author inner join app01_authordetail on app01_author.ad_id app01_atuhordetail.id where app01_author.name='张三'
# 2.基于对象的跨表查询
obj = models.Author.objects.get(name='张三')
print(obj.ad.addr) '''一对一:反向查询'''
# 查询北京的作者名称
obj = models.AuthorDetail.objects.get(addr='北京')
print(obj.author.name) # 反向查询:对象.表名小写.属性

一对多

'''一对多:正向查询'''
# 查询西游记这本书的出版社
obj = models.Book.objects.get(title='西游记')
print(obj.publishs.name) '''一对多:反向查询'''
'''一对多查询,给一查多,结果有多个:要使用对象.表名_set.all()'''
# 查询马哥出版社出版的书籍有哪些
ret = models.Publish.objects.get(name='马哥出版社')
books = ret.book_set.all() # <QuerySet [<Book: Book object>, <Book: Book object>]>
print(books.values('title')) # all()查询的是queryset对象,想得到里面的具体内容,要用values(字段)

多对多

'''一对一:正向查询'''
# 查看张三作者的家庭住址
# 1.sql语句查询
select app01_authordetail.addr from app01_author inner join app01_authordetail on app01_author.ad_id app01_atuhordetail.id where app01_author.name='张三'
# 2.基于对象的跨表查询
obj = models.Author.objects.get(name='张三')
print(obj.ad.addr) '''一对一:反向查询'''
# 查询北京的作者名称
obj = models.AuthorDetail.objects.get(addr='北京')
print(obj.author.name) # 反向查询:对象.表名小写.属性 '''一对多:正向查询'''
# 查询西游记这本书的出版社
obj = models.Book.objects.get(title='西游记')
print(obj.publishs.name) '''一对多:反向查询'''
'''一对多查询,给一查多,结果有多个:要使用对象.表名_set.all()'''
# 查询马哥出版社出版的书籍有哪些
ret = models.Publish.objects.get(name='马哥出版社')
books = ret.book_set.all() # <QuerySet [<Book: Book object>, <Book: Book object>]>
print(books.values('title')) # all()查询的是queryset对象,想得到里面的具体内容,要用values(字段) '''多对多:正向查询'''
# 查询西游记是谁写的
# 1.sql查询
select app01_author.name from app01_book inner join app01_book_authors on app01_book.id =
app01_book_authors.book_id inner join app01_author on app01_author.id = app01_book_authors.author_id # 2.正向查询
obj = models.Book.objects.get(title='西游记')
print(obj.authors.all().values('name')) '''多对多:反向查询'''
# 查询张三写了哪些书
obj = models.Author.objects.get(name='张三')
print(obj.book_set.all().values('title'))

基于双下划线的跨表查询

# 一对一
# 查看张三作者的家庭住址
'''正向写法'''
ret = models.Author.objects.filter(name='张三').values('ad__addr')
'''反向写法'''
ret = models.AuthorDetail.objects.filter(author__name='张三').values('addr')
print(ret) # <QuerySet [{'addr': '北京'}]> # 一对多
# 查询西游记这本书的出版社
'''正向写法'''
ret = models.Book.objects.filter(title='西游记').values('publishs__name')
print(ret) # <QuerySet [{'publishs__name': '小马哥出版社'}]>
'''反向写法'''
ret = models.Publish.objects.filter(book__title='西游记').values('name')
print(ret) # <QuerySet [{'name': '小马哥出版社'}]> # 多对多
# 查询水浒传是谁写的
'''正向写法'''
ret = models.Book.objects.filter(title='水浒传').values('authors__name')
print(ret)
'''反向写法'''
ret = models.Author.objects.filter(book__title='水浒传').values('name')
print(ret) #<QuerySet [{'name': '王五'}, {'name': '赵六'}]>

聚合查询

from django.db.models import Avg,Max,Min,Count,Sum
# 聚合查询
'''聚合查询使用aggregate()方法'''
ret = models.Book.objects.all().aggregate(Avg('price'))
ret = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price'))
print(ret,type(ret)) #{'price__avg': 15.0} <class 'dict'>
'''注意结果为字典类型.'''

分组查询

# 统计一下每个出版社出版书的平均价格
# 1.sql查询
select publishs_id,avg(price) from app01_book group by publishs_id;
select avg(app01_book.price) from app01_book inner join app01_publish on
app01_book.publishs_id = app01_publish.id group by app01_publish.name; # 2.分组查询
ret = models.Book.objects.values('publishs_id').annotate(a=Avg('price')) # 方式一 ret = models.Publish.objects.annotate(a=Avg('book__price')) # 方式二
# <QuerySet [<Publish: Publish object>, <Publish: Publish object>]>
print(ret.values('a','name'))

F查询

# 查询一下点赞数大于评论数的书籍
'''1.传统方法'''
ret = models.Book.objects.all()
book_list = []
for i in ret:
if i.dianzan > i.comment:
book_list.append(i) '''2.F查询'''
from django.db.models import F
''''针对本表不同字段数据进行对比时或者本表字典做一些统一修改时使用F查询'''
# 点赞数大于评论数的
ret = models.Book.objects.filter(dianzan__gt=F('comment')) '''F查询也支持统一修改'''
# 所有书籍上调10块
models.Book.objects.all().update(price=F('price')+10) # 支持四则运算

Q查询

from django.db.models import Q
'''
| -- or
& -- and
~ -- not
''' '''and与和or或'''
ret = models.Book.objects.filter(Q(comment__gt=30)|Q(dianzan__gt=50)) ret = models.Book.objects.filter(Q(comment__gt=30)&Q(dianzan__gt=50))
# 等同于# ret = models.Book.objects.filter(comment__gt=30,dianzan__gt=50) ret = models.Book.objects.filter(Q(comment__gt=30)|Q(dianzan__gt=50),publishDate__year='')
# 注意没有Q包裹的条件,写在Q包裹的条件后面.并且Q查询和publishyear之间是and的关系 '''Q查询多层嵌套'''
ret = models.Book.objects.filter(Q(Q(comment__gt=30)|Q(dianzan__gt=50))&Q(xx=11),publishDate__year='') '''条件取反:波浪线写在Q前面'''
# 取评论数小于等于30 的,或者点赞数大于50的
ret = models.Book.objects.filter(~Q(comment__gt=30)|Q(dianzan__gt=50))

day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询的更多相关文章

  1. Django框架04 /模板相关、别名/反向解析/路由分发

    Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...

  2. Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间

    Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间 一丶URLconf配置 ...

  3. Python--day67--include包含其他的url和反向解析URL

    1,include包含其他的url: 2,反向解析URL:

  4. Python - Django - 命名 URL 和反向解析 URL

    命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  5. django反向解析URL和URL命名空间

    django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...

  6. django url配置-反向解析-视图函数-HttpRequest对象-HttpResponse对象-cookies-session-redis缓存session

    """ --视图概述:-- 作用:视图接受WEB请求,并响应WEB请求 本质:视图就是一个python中的函数 响应: 1.网页: 一.重定向 二.错误视图 400,50 ...

  7. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  8. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  9. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

随机推荐

  1. es数据库基本操作

    1.es建立索引: curl -XPUT 'http://10.xx.xx.xx:9200/索引名称' 2.es查询所有索引: curl -XGET 'http://10.xx.xx.xx:9200/ ...

  2. 救救孩子吧,到现在还搞不懂TCP的三次握手四次挥手

    本文在个人技术博客同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩...   前几天发了一个朋友圈,发现暗恋已久的女生给我点了个赞,于是我当晚辗转反侧.彻 ...

  3. 冒泡排序(Bubble Sorting)

    基本介绍 时间复杂度O(n^2) 冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐 ...

  4. ClickHouse 参数配置

    转载自:https://xw.qq.com/cmsid/20200806A0PQ7X00?ADTAG=amp 在 ClickHouse 进程中,CPU 的主频越高越好,通常建议使用 32 以上的机型, ...

  5. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

  6. Spring Boot系列(四):Spring Boot源码解析

    一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...

  7. 使用 gopacket 进行数据包捕获,注入和分析

    原文链接:https://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket 接口文档:https:// ...

  8. 存储池与存储卷,使用virt-install创建虚拟机

    原文链接:https://www.cnblogs.com/zknublx/p/9199658.html 创建存储池 1.建立存储池的目录 mkdir /kvm/images 2.为了安全性,更改目录的 ...

  9. python3 raw 数据转换为jpg

    python3 raw 数据转换为jpg 我们大家都知道,sensor 直接出来的裸数据为raw 数据,没有经过编解码,压缩. 我们需要将raw数据转换为其他格式比如jpg,png,bmp 人眼才能看 ...

  10. 配置tomacat外部应用

    原来我们的项目一般放置在tomcat文件夹的webapp下,现在我放到外面,也希望tomact可以找到他