龙珠z电光火石3存档,山炮进城2西瓜影音,淘宝网货源
目录
一张表的字段信息太多,可以人为分出一张表
外键字段建在 多的那一方
多对多的外键关系需要建立第三张表来专门处理
以图书馆里系统为例,创建图书表,作者表,出版社表
以图书管理系统为例,在django orm 建立表关系:
class book(models.model): title = models.charfield(max_length=32) # 小数总共八位,小数占两位 price = models.decimalfield(max_digits=8, decimal_places=2) # 书与出版社是一对多关系,并且书是多的一方,所以外键字段建在书表中 publish = models.foreignkey(to='publish') # to用来指代和哪张表有关系,默认关联的就是主键字段 # 书与作者是多对多的关系, 外键字段建在任意一方都可以,建议建在查询频率较高的一方 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') class author_detail(models.model): phone = models.bigintegerfield() addr = models.charfield(max_length=32)
注意点:
_id
后缀;如果自己加了_id
,会在后面再加一个_id
publish = models.foreignkey(to='publish')
默认关联的是主键id,如果主键不是id,要自己关联, 可以加to_field=
于指定字段做关联urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test/', views.test), url(r'testadd/', views.testadd) ]
如果url.py这样写,test
和testadd
后缀的访问路径,返回的内容是一样的,原因如下:
启动django,在浏览器输入127.0.0.1:8000/test
,django会自动加斜杠。
不加斜杠(127.0.0.1:8000/test
),先匹配一次试试,如果匹配不上,会让浏览器重定向,加一个斜杠(127.0.0.1:8000/test/
)再来一次匹配,如果还匹配不上,才会报错。
在配置文件中settings.py中添加:
append_slash = false # 该参数默认为true
urlpatterns = [ url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式 url(r'^test/$', views.test), # 一旦正立刻结束则表达式能够匹配到内容,会立刻结束匹配关系,直接执行后面对应的函数 url(r'^testadd/$', views.testadd) ]
这样设置,只能输入127.0.0.1:8000/test/
或127.0.0.1:8000/testadd/
注意:路由匹配只是匹配url部分,不匹配get携带的参数 ?后面的参数
正则表达式的无名分组
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/([0-9]{4})', views.test), # 表示test后面跟4个数字 url(r'^testadd/', views.testadd) ]
当你的路由中有分组的正则表达式,那么在匹配到内容执行视图函数的时候,会将分组内正则表达式匹配到的内容当作位置参数传递给视图函数。
# 在视图函数 def test(request, xxx): print('多余的参数:', xxx) return httpresponse('test view')
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/(\d+)/', views.test), url(r'^testadd/(?p<year>\d+)/', views.testadd) # 正则表达式有名分组 ]
当你的路由中有分组并且给分组起了别名,那么在匹配内容的时候,会将分组内的正则表达式匹配到的内容当作关键字参数传递给视图函数
# 在视图函数 def test(request, year): print('多余的参数:', year) return httpresponse('test view')
这样就可以利用有名和无名分组,我们就可以在调用视图函数之前给函数传递额外的参数
注意:有名分组和无名分组不能混合使用,但是同一情况下,无名分组可以使用多次,又名分组也可以使用多次
举个例子:
# urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/(\d+)/', views.test), url(r'^testadd/(?p<year>\d+)/', views.testadd), url(r'^index/', views.index), url(r'^home/', views.home), ] # views.py def index(request): return render(request, '') def home(request): return httpresponse('home')
在上述代码中,页面中有很多跳转的链接,都指向
home
路由。如果像改变home
的url地址,那么页面中的很多跳转
home
的链接都有改变,有没有动态绑定url地址的方法呢?反向解析就是。
反向解析:根据一个别名,动态解析出一个结果,该结果可以直接访问对应的url
url(r'^home/', views.home,name='xxx'), # 给路由与视图函数对应关系起别名
<p><a href="{% url 'xxx'%}">111</a></p>
from django.shortcuts import render,httpresponse,redirect,reverse def get_url(request): url = reverse('xxx') print(url) return httpresponse('get_url')
在解析的时候,你需要手动指定正则匹配内容的是什么
url(r'^home/(\d+)/', views.home, name='xxx'),
<p><a href="{% url 'xxx' 12 %}">111</a></p>
def get_url(request): url = reverse('xxx', args=(1,)) url2 = reverse('xxx', args=(1231,)) print(url) print(url2) return httpresponse('get_url')
手动传入的参数 只需要满足 能够被正则表达式匹配即可
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=121 %}">111</a></p>
可以直接用无名分组的情况
也可以规范写:
def get_url(request): url = reverse('xxx', kwargs={'year': 13123}) print(url) return httpresponse('get_url')
# urls.py url = (r'^edit_user/(\d+)/', views.edit_user, name='edit') # views.py 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整合到一个空的django项目里面, 然后在settings配置文件注册 再利用路由分发将多个app整合到一起即可完成大项目的拼接
路由分发解决的就是 项目的总路由 匹配关系过多的情况,
使用路由分发, 会出现:
使用:
只需要将所有的app的urls.py导入即可
from django.conf.urls import url, include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ url(r'^app01/', include(app01_urls)), url(r'^app02/', include(app02_urls)), ] # 路由分发
# app01 urls.py from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^reg/', views.reg), ] # app02 urls.py from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^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'))
前端:
<a href="{% url 'app01:reg' %}"></a> <a href="{% url 'app02:reg' %}"></a>
后端:
print(reverse('app01:reg')) print(reverse('app02:reg'))
但是也可以不用,你只要 保证起别名的时候,在整个django项目中不冲突即可
就是将一个动态网页伪装成一个静态网页,这样可以便于搜索引擎seo(search engine optimization),提高搜索引擎的收藏力度。
每创建一个虚拟环境就类似于你重新下载了一个纯净python解释器
之后该项目用到上面 你就装什么(虚拟环境一台机器上可以有n多个)
在urls.py
中路由匹配的方法有区别
用的是url
from django.conf.urls import url urlpatterns = [ url(r'^reg.html',views.reg,name='app01_reg') ]
用的是path
from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ]
form表达传文件需要注意的事项
# urls.py from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^upload/', views.upload) ] # views.py def upload(request): if request.method == 'post': print(request.files) # django会将文件类型的数据自动放入request.files file_obj = request.files.get('myfile') # 文件对象 # print(file_obj) # print(file_obj.name) with open(file_obj.name, 'wb') as f: for line in file_obj: f.write(line) return render(request, 'upload.html')
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
python求numpy中array按列非零元素的平均值案例
网友评论