目录

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. C++ IO的一些注意点

    读入这个坑一直以来都深受其麻烦,把遇到一些注意点记一下吧. 1.getchar读入 以前练线段树的时候做到Acwing#246 Interval GCD(原题在CodeHunter上,人懒就在Acwi ...

  2. springboot2整合activiti7具体步骤

    写在前面 需要提前了解的内容有 springboot.springSecurity.activiti基本使用 关于activiti Activiti项目是一项新的基于Apache许可的开源BPM平台, ...

  3. 第2篇scrum冲刺(5.22)

    一.站立会议 1.照片 2.工作安排 成员 昨天完成工作 今日计划工作 困难 陈芝敏 写第一篇scrum 博客,调整工作 计划,学习接口使用 调用小程序接口获取用户微信登录权限,初始化 加载倒计时慢, ...

  4. AI and Neuroscience: A virtuous circle

    转载:https://deepmind.com/blog/article/ai-and-neuroscience-virtuous-circle AI领域最近取得了显著进展.人工系统现在优于人类专家A ...

  5. latex:备忘代码

    1.脚注代码: \footnote{欧几里德,约公元前330--340年.} 结果为: 2.改变某个字的字体形状,表示强调 \emph{勾股定理} 结果为(勾股数这三个字与其他字不一样): 3.正文中 ...

  6. Synergy--跨平台的键鼠共享工具

    目前的状态,Windows并没有彻底放弃使用,现在一个电脑桌上摆放了一台Mac pro 一台Windows,两个笔记本都是15寸的,如果想要方便的使用外设鼠标键盘,整个桌子会异常的臃肿,鼠标键盘太占地 ...

  7. JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!

    Java 性能测试难题 现在的 JVM 已经越来越为智能,它可以在编译阶段.加载阶段.运行阶段对代码进行优化.比如你写了一段不怎么聪明的代码,到了 JVM 这里,它发现几处可以优化的地方,就顺手帮你优 ...

  8. java服务端实现微信小程序内容安全

    请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.i ...

  9. Shader Graph

    About Shader Graph https://docs.unity3d.com/Packages/com.unity.shadergraph@7.3/manual/index.html uni ...

  10. NGUI 优化

    1. Update Ngui 组件继承关系是  UIWidget : UIRect : MonoBehaviour. 因此由每个组件的独自调用update变更为,由某个更新点,统一调用会效率提升.并且 ...