ディレクトリ
テーブルのリレーションシップを作成します。
テーブルとテーブルの間の関係:一から一、多くの1つ、多くの多くの
テーブルとテーブルの間の関係を確認する方法?
考慮すべき視点の移調
一例として、図書館管理システム:
ブック表
- 書籍や出版社は、多くの関係に外部キーであります
- 外部キー関係の多くは、外部キーフィールドは、複数の周波数のいずれかで確立されています
プレステーブル
テーブルの上に
- 本と著者は、外部キー、多くの関係です
- テーブルは内部であるに建てられたかどうか、多くの外部キー関係、外部キーフィールドに多くの
- しかし、それは、クエリで比較的高い周波数を確立することが推奨され、テーブルの上に行きます
著者詳細表
- テーブル上の外部キー関係の細部の一つであります
- テーブルは内部であるに建てられた外部キーフィールド間の1つの外部キー関係
- しかし、そのテーブルに基づく勧告は、より高い周波数を使用するには
、私たちの後ろの利便ORMベースのクエリを使用する、より高い周波数を確立するために、外部キーパーティー
Djangoは、テーブル関係を確立します
それは自動的に関連付ける名前と別のテーブルの主キーフィールドをフィールドと外部キー関係を確立します
多く:字段名 = models.Foreignkey(to='表名')
多くの多く:字段名 = models.ManyToManyField(to='表名')
ワン:字段名 = models.OneToOneField(to='表名')
ForeignKey
フィールドとOneToOneField
フィールド、フィールドのORMにテーブルを作成するときに自動的に追加_id
かかわらず、彼らは自分自身を運ぶかどうか、接尾辞を。したがってという名前のフィールド:字段名_id
# 在书写表关系的时候 要先把基表全部写出来 之后再考虑外键字段
from django.db import models
# Create your models here.
class Book(models.Model):
# id是自动创建的 我们就不写了
title = models.CharField(max_length=64)
# price为小数字段 总共8位小数位占2位
price = models.DecimalField(max_digits=8,decimal_places=2)
# 书籍与出版社 是一对多外键关系
publish = models.ForeignKey(to='Publish') # 默认关联字段就是出版社表的主键字段
# publish = models.ForeignKey(to=Publish) # to后面也可以直接写表的变量名 但是需要保证该变量名在当前位置的上方出现
# 书籍与作者 是多对多外键关系
authors = models.ManyToManyField(to='Author') # 书籍和作者是多对多关系
"""
authors字段是一个虚拟字段 不会真正的在表中创建出来
只是用来告诉django orm 需要创建书籍和作者的第三张关系表
"""
class Publish(models.Model):
name = models.CharField(max_length=64)
addr = models.CharField(max_length=64)
class Author(models.Model):
name = models.CharField(max_length=32)
phone = models.BigIntegerField()
# 一对一外键关系建立
author_detail = models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model):
age = models.IntegerField()
addr = models.CharField(max_length=255)
Django
ライフサイクルフローチャート要求
Django
ルーティングシステム
URLの設定(urls.py
)同様のサイトディレクトリ、それはURLとビュー機能との間のマッピングテーブルの性質です。
このようにTELLではdjango
、このURLは、このコード、URL呼び出し、そのコードを呼び出します。
URL confの設定
基本フォーマット
from django.conf.urls import url
from app名字 import 视图名字
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
urlpatterns = [
url(r'^/$', views.home) # 为网站首页的标准写法,默认匹配后缀为空url路径调用views.home函数
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index),
url(r'^login/$', views.login),
]
正規表現:正規表現文字列、正規マッチングと一致するルートによれば、コンテンツ一旦正規に合わせることができるが、すぐに続行しない一致のビューに対応する機能を実行します。
- ビューは機能表示:呼び出し可能なオブジェクトを、典型的には、文字列パス・ビュー機能は、ビューまたは関数として指定されます
- パラメータ:デフォルトのビュー機能(辞書)に渡されるオプションのパラメータ
別名:オプションのパラメータ名
正規表現
^
:あなたのような、限り、最後はテストですと/合っているでしょう、ちょうど失う文字の前に発生します、ここで書いていない場合、一致は、文字で始まるsdfsdfasdfasdtest/
も認識することができます。
書き込み専用の場合は/
、例えば:(テスト/)、実際には、2つの要求があった:ユーザがURLのアドレスを入力するとhttps://www.xxx.com/test
、スキャンした後と何のテストを発見したブラウザが自動的にテストの最後でより1を追加します後、/
この時間は、テストにスキャン。
最初の要求が発見されていないので、DjangoはURLの後ろブラウザので、301リダイレクトされますプラス/再試行してください。
# 如果不写^表达式,只写/
urlpatterns = [
url(r'test/', views.test),
url(r'testadd/', views.testadd),
]
ユーザー入力URL、ジャンゴ自動的に私たちが追加するのに役立ちます/
、次のパラメータをすることができ、settings.py
中に添加并修改(默认没有)
されFalse
、それが自動的に禁止を追加します/
APPEND_SLASH = True # 自动加斜杠
不明グループ
特定の正規表現の括弧に一致するようにルーティングするとき
ブラケットは、ビュー関数として対応する位置に渡されたパラメータの内容に正規表現マッチングを一致する場合
# 无名分组
url(r'^test/([0-9]{4})/',views.test) # 会将括号内的内容当做位置参数传入视图函数中的args
# 视图函数
def index(request,args):
return HttpResponse('')
有名なグループ化
エイリアスからいくつかの正規表現に
パラメータに対応するキーとしてコンテンツにマッチする正規表現の括弧に一致するときに、ビュー関数に渡されます
# 有名分组
url(r'^test/(?P<year>\d+)/', views.test)
# 视图函数
def index(request, year) # 此处的year必须和有名分组中的year保持一致,因为是关键字参数,并不是位置参数,不可以像位置参数那样用形参接收。
それが混合されていないが、未知のパケットと既知パケットが、混在させることはできませんが、同じ命名規則、複数の限り、受信されたパラメータの対応する番号、またはパラメータがビューにキー機能に対応します。
逆引き参照
いくつかの方法によって、関係名、前端と後端からビューへのルーティング機能対応は、結果は名前によれば、アクセス結果がURLに対応得ることができます
この全体のプロジェクト名を繰り返すことはできません
どのように使用するには:
名前の間のルーティング機能およびビューの対応を与えます:
url(r'^testadd/', views.testadd, name='add') # name后面跟的就是名字
フロントエンドの分析:
{% url 'add' %}
バックエンドの分析:
# 需要导入reverse模块
from django.shortcuts import render, HttpResponse, redirect, reverse
reverse('add')
不明なパケット逆引き参照
# 无名分组反向解析
url(r'^testadd/(\d+)/', views.testadd, name='add')
# 前端解析
{% url 'add' 1 %}
# 后端解析
reverse('add', args=(12,))
有名なのは逆引き参照をグループ化します
# 前端解析
{% url 'edit_user' user_obj.id %} # 推荐使用
# 执行name为'edit_user'的url中的视图函数,并将user_obj.id一并传入url中的函数
{% url 'edit_user' year=1 %} # 标准的
# 有名分组反向解析
url(r'^edit_user_info/(\d+)', views.edit_user_info, name='edit_user')
# 后端解析
reverse('add', args=(12,))
reverse('add', kwargs={'year': 12})
擬似コードの解釈
url(r'^edit_user/(\d+)/',views.edit_user,names='edit')
{% for user_obj in user_queryset %}
<a href="edit_user/{{ user_obj.id }}/">编辑</a>
<a href="{% url 'edit' user_obj.id %}">编辑</a>
{% endfor %}
def edit_user(request,edit_id):
reverse('edit',args=(edit_id,))
ルートの配布
ルーティングし、より多くの機能を対応するビューの間の関係は、総ルーティングコードが総ルーティングコードが悪いのメンテナンスで考慮して、長すぎるときのDjangoプロジェクトが比較的大きい場合には、Djangoのサポート各アプリには独自のurls.py.を持つことができます
そして、総ルートはもはやビュールーティング機能との対応関係しませんが、一つだけの操作のみタスク分散。
要求に応じて、現在の要求を特定するアプリケーションに属する機能へのアクセスを必要とし、自動的に対応するアプリurls.pyの内部に送達し、次いでurls.py.内部アプリビュー機能と一致するルートを行います
不仅如此,每个app除了可以有自己的urls.py之外,还可以有自己的static静态资源文件夹,templates模板文件夹。
基于上面的特点,基于django分小组开发会变得额外的简单
每个人只需要开发自己的app即可,之后只需要创建一个空的django项目,将多个人的app全部拷贝到项目下,配置文件注册。
1、总路由
1.总路由
from django.conf.urls import url,include
# 路由分发 注意事项应用名后面千万不能加$
# from app01 import urls as app01_urls
# from app02 import urls as app02_urls
# url(r'^app01/',include(app01_urls)),
# url(r'^app02/',include(app02_urls))
# 简写
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
2、子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index)
]
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index/',views.index)
]
名称空间(了解)
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
后端解析
reverse('app01:index')
reverse('app02:index')
前端解析
{% url 'app01:index' %}
{% url 'app02:index' %}
# 在给路由与视图函数起别名的时候只需要保证永远不出现冲突的情况即可
# 通常情况下我们推荐期别名的时候加上当前应用的应用名前缀
url(r'^index/',views.index,name='app01_index')
url(r'^index/',views.index,name='app02_index')
虚拟环境
我们想做到针对不同的项目,只安装项目所需要的功能模块,项目用不到的一概不装,来避免加载资源时的消耗。
如何创建虚拟环境?利用pycharm的虚拟环境。此时的虚拟环境类似有一个新的python解释器。
Django
版本区别
路由层:
1.x 用的是url
2.x、3.x用的是path
urlpatterns = [
path('index/',views.index)
]
url第一个参数是一个正则表达式,而path第一参数不支持正则表达式,写什么就匹配什么。
如果觉得path不好用,2.x和3.x版本提供了一个跟url一样的功能:
re_path # 等价于1.x版本里面的url功能
urlpatterns = [
re_path(r'^index/',views.index)
]
虽然path不支持正则表达式,但是它给你提供了五种默认的转换器:
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
path('login/<int:year>/',login
除了默认的五种转换器之外,还支持你自定义转换器
class MonthConverter:
regex='\d{2}' # 属性名必须为regex
def to_python(self, value):
return int(value)
def to_url(self, value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
伪静态
url以.html
结尾,给人的感觉好像是这个文件是写死的,内容不会轻易的改变
作用:
为了提高网站的被搜索引擎收藏的力度,提供网站的SEO查询效率
但是,无论你怎么做优化,都玩不过RMB玩家