day 53
orm表关系如何建立
多对多
一对多
一对一
换位思考 先站在一张表上面分析 然后再站在另一张分析
一对多 外键字段建在 多的那一方
多对多 多对多的外键关系需要建立在第三张表上来专门处理
在models中导入模块from django.db import models
# Create your models here.
# 先不要考虑外键关系 先创基表
class Book(models.Model):
title = models.CharField(max_length=32)
# 小数总共八位 小数占两位
price = models.DecimalField(max_digits=8,decimal_places=2)
# 书跟出版社是一对多 并且书是多的一方 所以外键字段健在书表中
publish_id = models.ForeignKey(to='Publish') # to用来指代跟哪张表有关系 默认关联的就是表的主键字段
"""
一对多外键字段 创建的时候 同步到数据中 表字段会自动加_id后缀
如果你自己加了_id 我orm头铁 再在后面加一个_id
所以你在写一对多外键字段的时候 不要自作聪明的加_id
"""
# 书跟作者是多对多的关系 外键字段建在任意一方都可以 但是建议你建在查询频率较高的那一方
author = models.ManyToManyField(to='Author') # django orm会自动帮你创建书籍 和作者的第三张关系表
# author这个字段是一个虚拟字段 不能在表中展示出来 仅仅只是起到一个高速orm 建第三章表的关系的作用
class Publish(models.Model):
title = models.CharField(max_length=32)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 一对一的表关系 外键字段建在任意一方都可以 但是建议你建在查询频率较高的那一方
author_detail = models.OneToOneField(to='Author_detail') # fk + unique
"""
一对一外键字段 创建的时候 同步到数据中 表字段会自动加_id后缀
如果你自己加了_id 我orm头铁 再在后面加一个_id
所以你在写一对一外键字段的时候 不要自作聪明的加_id
"""
class Author_detail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
django中间件
反代理中间件
语言环境中间件
消息中间件
会话中间件
保护中间件
交易中间件
自定义的中间件必须继承MiddlewareMixin
访问index之前需要登录,logout退出登录返回login,采用中间件
中间件注册在settings中的MIDDLEWARE列表中
路由层
urls.py 路由层
url第一个参数是正则表达式 只要该正则表达式能够匹配到的内容
就会立刻执行后面的视图函数 而不再往下继续匹配了
路由匹配
取消django自动让浏览器加斜杠的功能
APPEND_SLASH = False # 该参数默认是
Truefrom app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式
url(r'^test/$', views.test), # 一旦正则表达式能够匹配到内容 会立刻结束匹配关系 直接执行后面对应的函数
在后面加上$前面加上^必须输入这两个符号内的数据,输入其他的数据会报错
url(r'^testadd/$', views.testadd),
]
url(r'^test/[0-9]{4}', views.test),必须在test/后面跟上四位0-9之间的数字,才能显示
url(r'^test/([0-9]{4})/', views.test),用()包裹住[0-9]{4},运行会报错:test() takes 1 positional argument but 2 were given,
翻译:test()有一个位置参数,但给出了两个,然后在运行框下面删除run内容,在views中request后面添加xxx,然后打印print('多余的参数',xxx),再次运行就可以正常显示了,在运行框会返回多余的参数1234
django匹配路由的规律
不加斜杠 先匹配一次试试 如果匹配不上 会让浏览器从定向 加上一个斜杠 再来一次 如果还是匹配不上 才会报错
路由匹配值匹配url部分
不匹配?后面的get携带的参数
无名分组
无名分组
url(r'^test/(\d+)/',views.test)
test() takes 1 positional argument but 2 were given
会将括号内匹配到的内容当做 位置参数 传递给后面的视图函数test(request,args)
当你的路由中有分组的正则表达式 那么在匹配到的内容
执行视图函数的时候 会将分组内正则表达式匹配到的内容当做位置参数传递给视图函数
test(request,分组内正则表达式匹配到的内容)
有名分组
会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数
url(r'^testadd/(?P<year>\d+)/', views.testadd),
testadd() got an unexpected keyword argument 'year'
当你的路由中有分组并且分组起了别名 那么在匹配内容的时候
会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数
testadd(request,year=分组内的正则表达式匹配到的内容)
利用有名无名分组 我们就可以在调用视图函数之前给函数传递额外的参数
注意:有名和无名分组不能混合使用
在用一种分组的情况下可以有多个
反向解析
根据一个别名 动态解析出一个结果 该结果可以直接访问对应的url
第一种情况
路由中没有正则表达式 直接是写死的
url(r'^home/', views.home,name='xxx'),
# 给路由与视图函数对应关系起别名 前端反向解析
{% url 'xxx' %} 后端反向解析
from django.shortcuts import render,HttpResponse,redirect,reverse
url = reverse('xxx')第二种情况
无名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么
url(r'^home/(\d+)/', views.home,name='xxx'),
#给路由与视图函数对应关系起别名 前端反向解析
<p><a href="{% url 'xxx' 12 %}">111</a></p>
<p><a href="{% url 'xxx' 1324 %}">111</a></p>
<p><a href="{% url 'xxx' 14324 %}">111</a></p>
<p><a href="{% url 'xxx' 1234 %}">111</a></p> 后端反向解析
url = reverse('xxx',args=(1,))
url1 = reverse('xxx',args=(3213,))
url2 = reverse('xxx',args=(2132131,))
手动传入的参数 只需要满足能够被正则表达式匹配到即可
第三种情况
有名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么
有名分组的反向解析可以跟无名分组一样
但是最正规的写法
url(r'^home/(?P<year>\d+)/', views.home,name='xxx'),
给路由与视图函数对应关系起别名
前端
可以直接用无名分组的情况
<p><a href="{% url 'xxx' 12 %}">111</a></p>
# 你也可以规范写法
<p><a href="{% url 'xxx' year=1232 %}">111</a></p> # 了解即可
后端
可以直接使用无名分组的情况
url = reverse('xxx',args=(1,))
# 你也可以规范写法
url = reverse('xxx',kwargs={'year':213123}) # 了解即可 例子:
以编辑功能为例
url(r'^edit_user/(\d+)/',views.edit_user,name='edit') def edit_user(request,edit_id):
# edit_id就是用户想要编辑数据主键值
pass {% for user_obj in user_list %}
<a href='/edit_user/{{user_obj.id}}/'>编辑</a>
<a href='{% url 'edit' user_obj.id %}'>编辑</a>
{% endfor %}
路由分发
前提
在django中所有的app都可以有自己独立的urls.py templates static
正是由于上面的特点 你用django开发项目就能够完全做到多人分组开发 互相不干扰
每个人只开发自己的app
小组长只需要将所有人开发的app整合到一起即可完成一个大项目的拼接
路由分就是解决项目的总路由匹配关系过多的情况
使用路由分发 会将总路由不再做匹配的活 而仅仅是做任务分发(请求来了之后 总路由不做对应的关系,只询问你要询问哪个app的功能 然后将请求转发给对应的app去处理)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式
# 路由分发
url(r'^app01/',include(app01_urls)), #路由分发需要注意的实现,就是总路由里面不能以$结尾
url(r'^app02/',include(app02_urls)),
]
子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^reg/',views.reg)
]
from django.conf.urls import url
from app02 import views
urlpatterns = [
url('^reg/',views.reg)
]
最省事的写法
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls')),
名称空间
当多个app中出现了起别名冲突的情况 你在做路由分发的时候 可以给每个app创建一个名称空间
然后在反向解析的时候 可以选择到底去哪个名称空间中查找别名
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
后端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>
其实上面的名称空间知识可以完全不用 你只需要保证起别名的时候 在整个django项目中不冲突即可
可以定义参考的文献
起别名的时候统一加上应用名前缀
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
urlpatterns = [
url('^reg/',views.reg,name='app01_reg')
]
伪静态
将一个动态网页伪装成一个静态的网页(在网址的最后面加上.html) 以此来提高搜索引擎SEO查询频率和收藏的力度
所谓的收藏引擎其实就是一个特别巨大的爬虫程序,把你输入的关键字,搜索展示出来对应的内容
虚拟环境
给每一个项目 装备该项目所需要的模块 不需要的模块一概不装
每创建一个虚拟环境就类似于你重新下载了一个纯净的python解释器
之后该项目用到里面的什么模块 你就装什么(虚拟环境一台机器上可以有N多个)
不要在你的机器上限制创建虚拟环境
django版本的区别
django1.X django2.X
urls.py 中路由匹配的方法有区别
django2.X用的是path
urlpatterns = [
path('admin/', admin.site.urls),
]
django1.X用的是url
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
# 区别django2.X里面path第一个参数不是正则也不支持正则 写什么就匹配什么
虽然path不支持正则 感觉也好用 django2.X还有一个re_path的方法 该方法就是你django1.X里面的url
虽然path支持 但是它提供了五种转换器 能够将匹配到的数据自动转换成对应你的数据类型转换器
str 匹配除了路径分隔符(/) 之外的非空字符串,这是默认的形式
int 匹配正数,包含0
slug 匹配字母、数字以及横杠、下换线组成的字符串
uuid 匹配格式化的uuid,为防止多个URL映射到同一个页面,必须包含破折号并且字母必须小写,如458464d45-4546e-464d585c。返回一个UUID实例。
path 匹配任何非空字符串,包含了路径分隔符(/)(不能用?)。这样就可以与完整的URL路径进行匹配,而不仅仅是与URL路径的一部分进行匹配str。
除了有默认五种转换器之外 还支持自定义转换器
转换器是一个类或接口,它的要求有三点:
regex:类的属性,字符串类型
to_python(self,value)方法,value是由类属性regex所匹配到的字符串,返回具体的python变量值,以供django传递到对应的视图函数中
to_url(self,value)方法,和to_python相反,value是一个具体的python变量值,返回其字符串,通常用于url反向引用
视图层
form表单上传文件 后端如何获取文件
form表达文件需要注意的事项
- method必须改成post
- enctype改成formdata格式
前期你在使用post朝后端发送请求的时候 需要去settings配置文件中注释掉一个中间件csrf
day 53的更多相关文章
- 53. 特殊的O(n)时间排序[sort ages with hashtable]
[本文链接] http://www.cnblogs.com/hellogiser/p/sort-ages-with-hashtable.html [题目] 某公司有几万名员工,请完成一个时间复杂度为O ...
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
- 【leetcode】Maximum Subarray (53)
1. Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ...
- 【原创】loadrunner12.53 录制脚本时 打不开网页或者打开网页慢?
问题描述: 之前刚装12.5版本时候,用 WebTours测试过,应用程序选择自己本地IE浏览器.exe程序,输入url地址就可以成功录制了 . 但是由于公司网络配置环境改变了(猜测),现 ...
- 【原创】安装LoadRunner12.53 版本时出现Critical error的解决方法
步骤: 1.在官网上下载LoadRunner12.53正版,只不过要注册,然后官网会给个序列号. 2.安装成功之后,快捷键已创建,打开Virtual User Generator时,提示如下错误: 此 ...
- [译] OpenStack Liberty 版本中的53个新变化
一个新的秋季,一个新的OpenStack 版本.OpenStack 的第12个版本,Liberty,在10月15日如期交付,而且目前发行版本已经备好了.那么我们期望能从过去六个月时间的开发中获得些什么 ...
- AWS国际版的Route 53和CloudFront
注册AWS国际版账号后,却发现Route 53和CloudFront功能是无法使用的.于是提交了一个Service Request,得到的答复是这两个功能需要验证后才能激活. 在控制台中点击进入Rou ...
- Joomla![1.5-3.4.5]反序列化远程代码执行EXP(直接写shell)
Usage:x.py http://xxx.com # coding=utf-8# author:KuuKi# Help: joomla 1.5-3.4.5 unserialize remote co ...
- Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedFilesVector VirtualizedItemsVector 绑定
[源码下载] 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedF ...
随机推荐
- 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势
启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...
- 二分+2-sat——hdu3062
hdu3622升级版 注意要保留两位小数 /* 给定n对圆心(x,y),要求从每对里找到一个点画圆,不可相交 使得最小半径最大 二分答案,设最小半径为r 然后两两配对一次进行判断,在2-sat上连边即 ...
- 连通图,set——cf1037E
看了题解又调了很久,用set来维护当前满足条件的pair<degree[v],v> 离线操作,先建好一张图,然后建立好集合,每次删边后都把集合里不满足条件的点删去,同时更新集合 /* 离线 ...
- JAVA 类加载机制学习笔记
JAVA 类生命周期 如上图所示,Java类的生命周期如图所示,分别为加载.验证.准备.解析.初始化.使用.卸载.其中验证.准备.解析这三个步骤统称为链接. 加载:JVM根据全限定名来获取一段二进制字 ...
- 安卓手机端微信网页浏览记录清理debugx5.qq.com
最近我们环境从复)星(云切换到阿里云.早上地铁路上就有小伙伴@,一阵搜索.找的如下的方法. 记录一下: 目前只支持安卓手机的微信内置浏览器清理. 由腾讯提供的网址http://debugx5.qq.c ...
- 《DSP using MATLAB》Problem 8.19
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 从三层架构到Spring框架
首先是软件的应用分层架构 标准三层架构: 1:数据访问层:实现了数据的持久化 2:业务逻辑层:对逻辑的实现及处理,实际上不可能在表示层对数据不做任何处理,但是尽可能的将逻辑分为一层 3:表示层:数据的 ...
- linux命令补全工具
一:下载bash-competion工具 https://files.cnblogs.com/files/zgngg/bash-completion.zip 二:解压 unzip bash-comp ...
- python 之 heapq (堆)
堆的实现通过构造二叉堆,实为二叉树的一种:这种数据结构具有以下性质: 任意节点小于(或大于)它的后裔,最小元(或最大元)在堆的根上 堆总是一颗完整树.即除了最低层,其它层的节点都被元素填满,且最低层极 ...
- Error: Could not link: /usr/local/share/doc/homebrew
mac 执行brew update 报错 Error: Could not link: /usr/local/share/doc/homebrew 更新brew,报错 Error: Could not ...