日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

django目录下的路由系统和视图函数

發(fā)布時(shí)間:2023/12/20 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django目录下的路由系统和视图函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  一、Django路由系統(tǒng)(url)

  1、什么是路由系統(tǒng)

      路由系統(tǒng)的本質(zhì)是URL模式以及要為該URL模式調(diào)用的視圖函數(shù)之間的一個(gè)映射表即不同的url路徑對(duì)應(yīng)的不同的函數(shù),該路由系統(tǒng)是存放在全局配置文件urls.py中,之所以叫路由系統(tǒng)是為了好聽

  2、路由系統(tǒng)格式:

    urlpatterns = [url(正則表達(dá)式, views視圖函數(shù),參數(shù),別名),]     注釋:1、正則表達(dá)式就是Python中提及到的正則表達(dá)式,匹配的是url下的路徑        ?? 2、視圖函數(shù)就是url路徑對(duì)應(yīng)的函數(shù)        ?? 3、參數(shù)就是需要往視圖函數(shù)傳遞的參數(shù),是一個(gè)字典的形式       ??? 4、別名就是正則表達(dá)式所匹配到數(shù)據(jù)結(jié)果的別名     eg:        1、如圖無名函數(shù)                      如果在路由規(guī)則中的正則表達(dá)式內(nèi)既有無名分組又有通過字典形式傳遞給視圖函數(shù)的參數(shù),那么就相當(dāng)于傳遞了一個(gè)位置參數(shù),兩個(gè)關(guān)鍵字參數(shù),且遵循位置實(shí)參在關(guān)鍵字參數(shù)之前。               2、如圖有名函數(shù)                            當(dāng)路由規(guī)則中出現(xiàn)有名函數(shù),那么視圖函數(shù)中傳遞的形參名稱和這個(gè)有名函數(shù)名稱一樣,必須叫ttt(相當(dāng)于默認(rèn)函數(shù))。       ??? 3、如圖name參數(shù):                   ?????????????????????????         主要是和html頁(yè)面中的form表單中的action路徑進(jìn)行交互的,之所以加了/blog是由于我做了路由重分發(fā),如果添加別名就不能對(duì)正則表達(dá)式進(jìn)行無名分組和有名分組了   3、路由重分發(fā)(當(dāng)有多個(gè)項(xiàng)目時(shí)可以把url對(duì)應(yīng)的函數(shù)寫在每個(gè)項(xiàng)目?jī)?nèi),需要在全局urls內(nèi)做路由重分發(fā),相當(dāng)于給每個(gè)項(xiàng)目分配小組長(zhǎng))     1、格式       urlpatterns = [url(正則表達(dá)式,include(分發(fā)的文件路徑),]      ?urlpatterns = [ url(r'^blog/', include('blog.urls')),]       注釋:該正則表達(dá)式匹配的是項(xiàng)目名稱,include的是項(xiàng)目名稱下寫路由系統(tǒng)的文件,以后訪問的路徑需要在其端口后加項(xiàng)目名稱。     全局urls配置文件需要先引入一個(gè)include模塊才能路由重分發(fā)(from django.conf.urls import url,include   4、客戶端向服務(wù)器端傳遞參數(shù)的方式:     ?? 1、通過數(shù)據(jù)傳遞參數(shù),把數(shù)據(jù)寫在url上,通過?&傳參       eg: http://1277.0.0.1:8080/blog/?id=1200
???    ? 2、通過路徑傳遞參數(shù)       ? eg:http://1277.0.0.1:8080/blog/1200
?? ??? 5、客戶端向服務(wù)器端發(fā)送請(qǐng)求的方式:      1、GET方式:         請(qǐng)求數(shù)據(jù)存放在url路徑里面      2、POST方式:         請(qǐng)求數(shù)據(jù)存放在post請(qǐng)求體里面      3、注意:get方式請(qǐng)求的參數(shù)只能存放在url路徑上,但是post方式請(qǐng)求的參數(shù)可以即可以存放在post請(qǐng)求體內(nèi)也可以在url內(nèi)。 ? 二、Django視圖函數(shù)(views)   1、在http協(xié)議中會(huì)產(chǎn)生兩個(gè)對(duì)象    ? http請(qǐng)求:HttpRequest對(duì)象,django自動(dòng)創(chuàng)建??????         http響應(yīng):HttpResponse對(duì)象,需要自己手動(dòng)創(chuàng)建,其實(shí)就是導(dǎo)入對(duì)象下的屬性(? HttpResponse類django.http.HttpResponse)     2、HttpRequest對(duì)象下的方法和屬性           1、path:請(qǐng)求頁(yè)面的全路徑,不包括請(qǐng)求ip和端口           2、method:請(qǐng)求是使用的什么方式,post或get,得到的結(jié)果是大寫的POST,GET             3、GET:get請(qǐng)求方式的請(qǐng)求體信息,得到的是個(gè)字典對(duì)象           4、POST:post請(qǐng)求方式的請(qǐng)求體信息,得到的是個(gè)字典對(duì)象            5、COOKIES: 包含所有cookies的標(biāo)準(zhǔn)Python字典對(duì)象;keys和values都是字符串。   3、HttpResponse對(duì)象下的方法和屬性         1、render():主要是做模板渲染用的             1、格式:render(req,"網(wǎng)頁(yè)名稱",{前端鍵:后端值}|locals())         2、redirect("路徑"):主要是頁(yè)面跳轉(zhuǎn)用的         3、locals() :可以直接將函數(shù)中所有的變量傳給模板         4、關(guān)于redirect與render的區(qū)別:
?? ??? ??? ??????????? redirect走的是路徑,頁(yè)面跳轉(zhuǎn)路徑重新加載
?? ??? ??? ??? ??? ??? render返回的是模板,只是返回一個(gè)頁(yè)面,路徑不會(huì)重新加載。
三、Template基礎(chǔ) (模板系統(tǒng))  
    1、模板系統(tǒng)的組成           組成:HTML代碼+邏輯控制代碼       2、邏輯控制代碼的組成(語(yǔ)法格式)           1、格式1:使使用一個(gè)大括號(hào)加兩個(gè)百分號(hào)來渲染標(biāo)簽,可以渲染任意類型的html標(biāo)簽         {% %}           2、格式2:使用兩個(gè)大括號(hào)來渲染標(biāo)簽內(nèi)的變量,可以引用任意格式的變量?!  ?/span>         {{?? }}?           注釋:只要帶有模板語(yǔ)法的html都稱之為模板,render方法渲染時(shí) 把后端變量嵌入到模板中,其格式為:              render(客戶端請(qǐng)求體名稱,"發(fā)送的html模板",{''模板的值":"傳入的數(shù)據(jù)"})         3、邏輯控制代碼的語(yǔ)句             1、萬能的句點(diǎn)號(hào)                 模板系統(tǒng)可以通過點(diǎn)數(shù)字的方式來索取后端數(shù)據(jù)傳過來的列表和字典           2、{% if %} 的使用                   1、使用{% if %} 時(shí)必須和{% endif %}連用,主要是在模板中進(jìn)行判斷的其語(yǔ)法結(jié)構(gòu)和python相同,都支持if elif? else等             2、{% if %} 標(biāo)簽接受and,or或者not來測(cè)試多個(gè)變量值或者否定一個(gè)給定的變量                    3、{% if %} 標(biāo)簽不允許同一標(biāo)簽里同時(shí)出現(xiàn)and和or,否則邏輯容易產(chǎn)生歧義,例如下面的標(biāo)簽是不合法的:                      eg: {% if obj1 and obj2 or obj3 %}            ?  3、{% for %}的使用                 ? 1、格式:{% for obj in list [ 方法 ]%}??? 處理的對(duì)象  {% endfor %}                    2、具體方法:                       1、reversed:在標(biāo)簽里添加reversed來反序循環(huán)列表                 3、{% for %}標(biāo)簽可以嵌套:                    1、格式:              {% for country in countries %} <h1>{{? country }}</h1><ul>                {% for city in country.city_list %}                              <li>{{ city }}</li>                {% endfor %}  </ul>               {% endfor %}                      2、具體的嵌套對(duì)象:                           1、forloop.counter表示循環(huán)的次數(shù),它從1開始計(jì)數(shù),第一次循環(huán)設(shè)為1                      2、forloop.counter0 類似于forloop.counter,但它是從0開始計(jì)數(shù),第一次循環(huán)設(shè)為0                      3,forloop.revcounter             ??            4,forloop.revcounter0                 ?           5,forloop.first當(dāng)?shù)谝淮窝h(huán)時(shí)值為True,在特別情況下很有用:                          4、empty的用法                       {{li }}                        { {% for i in list %}                            <li>{{ forloop.counter0 }}----{{ i }}</li>                       {% empty %}                            <li>this is empty!</li>                       {% endfor %}                     注釋:富有魔力的forloop變量只能在循環(huán)中得到,當(dāng)模板解析器到達(dá){% endfor %}時(shí)forloop就消失了,當(dāng)用for循環(huán)一個(gè)list時(shí),如果該list 為空那么就會(huì)走empty下面的語(yǔ)法                 5、使用{% for %}時(shí)必須和{% endfor %}連用,基本語(yǔ)法和python一樣           4、filter過濾器的使用方式               1、語(yǔ)法格式:{{obj|filter:param}}??? obj為要操作的對(duì)象,filter為具體的操作方法,param為要做的值           filter所指代的具體操作方法:
          1、add : 給obj變量加上相應(yīng)的值,主要用于數(shù)字的相加    
          2、 addslashes : 給obj變量中的引號(hào)前加上斜線        ? ?          3、 capfirst : obj首字母大寫,主要是對(duì)字符串進(jìn)行設(shè)置             ? 4、 cut : 從obj字符串中移除指定的字符 比如說是移除obj中的空格                       eg:#value3='he llo wo r ld'   {{ value3|cut:' ' }}<br>        ?     ? 5、 date : 格式化日期字符串 ?            eg:#value4=datetime.datetime.now(){{ value4|date:'Y-m-d' }} 以年-月-日的方式訪問 ?        ? 6、 default : 如果值是False,就替換成設(shè)置的默認(rèn)值,否則就是用本來的值?                eg:#value5=[ ]      {{ value5|default:'空的' }}        ? ?    7、 default_if_none: 如果值是None,就替換成設(shè)置的默認(rèn)值,否則就使用本來的值             8、truncatechars? 按照字符串的個(gè)數(shù)截?cái)鄶?shù)據(jù),截?cái)嗟臄?shù)據(jù)按照省略號(hào)顯示               eg:{{ i|truncatechars:3}}                          9、truncatewords 按照單詞的個(gè)數(shù)截?cái)鄶?shù)據(jù),截?cái)嗟臄?shù)據(jù)按照省略號(hào)顯示
          eg:{{ i|truncatewords:4}}   
     5、{% url %}: ?引用路由配置的地址 (別名的使用)
           
     6、with重新取名,就是說后端傳到前端的數(shù)據(jù)名字太長(zhǎng)了就可以用with重新給他定義一個(gè)名稱            {% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}         7、禁止模板渲染:verbatim        {% verbatim %} ?????????{{ hello }}??
      {% endverbatim %}     8、自定義filter和simple_tag       1、檢測(cè)settings配置文件的INSTALLED_APPS是否有自己的項(xiàng)目應(yīng)用的文件名       2、在app應(yīng)用中創(chuàng)建templatetags模塊包(必須這樣創(chuàng)建且模塊名稱不能改變)       3、創(chuàng)建任意 .py 文件,如:my_tags.py             4、在使用自定義simple_tag和filter的html文件中導(dǎo)入之前創(chuàng)建的 my_tags.py :{% load my_tags %}           5、simple_tag和filter的區(qū)別         1、調(diào)用方式不同:           filter是通過{{}}的方式來調(diào)用的,比如{{ num|filter_multi:2 }}           simple_tag是通過{%%}的方式來調(diào)用的,比如{% simple_tag_multi num 5 6%}         2、所傳遞的值得個(gè)數(shù)不同           無論是自定義的filter還是模板自帶的filter只能傳遞一個(gè)值到模板中,也就是說":"后面最多只能有一個(gè)值           而simple_tag呢,后端自定義多少個(gè)值,前端就能接收多少個(gè)值。         3、filter可以在if等語(yǔ)句后使用,而simple_tag不可以                9、extend模板繼承       1、首先需要了解后臺(tái)管理布局(主要是通過position:fixed、overflow=auto的方式對(duì)布局進(jìn)行定位)       2、模板繼承步驟         1、先在templates中創(chuàng)建好一個(gè)模板(母版)取名為base.html,以供子模板繼承         2、在需要繼承模板的子模板中添加上{% extends "母版名稱" %}即{% extends "base.html" %}之后子模板就繼承了母版的全部代碼         3、如果子模板需要替換母版上的代碼內(nèi)容需要提前在母版需要替換的部分創(chuàng)建好盒子           格式:{% block x % } y {% endblock %} 其中x代表盒子的名稱,必須與后端替換的盒子名稱一樣,y代表需要替換的內(nèi)容 ?        4、在子模板中創(chuàng)建母版內(nèi)一樣的盒子,然后在其里面寫入你想要替換的代碼就可以了 格式:{% block x % } y {% endblock %} ? 其中x代表的是盒子的名稱與前端母版盒子名稱一樣,y代表的是替換后的內(nèi)容 5、在子模板中可以通過{{ block.super }}這個(gè)標(biāo)簽來獲取到母版中盒子的內(nèi)容 格式:{% block x % }? {{ block.super }} y {% endblock %} ? {{ block.super }}代表獲取到母版盒子內(nèi)的內(nèi)容,y代表需要添加的內(nèi)容,母版中盒子越多在子模板中可更改性就越強(qiáng)
四、Models數(shù)據(jù)庫(kù)
  1、? django默認(rèn)支持sqlite,mysql, oracle,postgresql數(shù)據(jù)庫(kù),但是在測(cè)試環(huán)境默認(rèn)選擇使用的是sqlite數(shù)據(jù)庫(kù)  
  2、orm對(duì)象映射關(guān)系               1、如圖所示:                    注釋:類實(shí)例化對(duì)象一次就相當(dāng)于是向表中添加一條記錄。     3、設(shè)置數(shù)據(jù)庫(kù)鏈接(setting中設(shè)置)         DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',              'NAME': 'books', #你的數(shù)據(jù)庫(kù)名稱                     'USER': 'root', #你的數(shù)據(jù)庫(kù)用戶名                    'PASSWORD': '', #你的數(shù)據(jù)庫(kù)密碼                  ? 'HOST': '', #你的數(shù)據(jù)庫(kù)主機(jī),留空默認(rèn)為localhost                  ? 'PORT': '3306', #你的數(shù)據(jù)庫(kù)端口 } }       注釋:由于django對(duì)python3不支持mysqldb的搜素引擎,需先下載pymysql第三方模塊,然后在django程序中導(dǎo)入該模塊引用后正常連接            4、在models中設(shè)計(jì)數(shù)據(jù)庫(kù)表(就是設(shè)計(jì)表字段)       1、設(shè)計(jì)表字段方式                 注釋:程序的models.py文件中需先引入一個(gè)模塊(from django.db import models),然后才能通過類來繼承該模塊從而設(shè)計(jì)表字段       2、字段類型參數(shù)        1、CharField(max_length=x) :字符串字段,用于較短的字符串,x指代的是字符串的長(zhǎng)度        2、IntegerField():用于保存一個(gè)整數(shù)        3、DecimalField(max_digits=x,decimal_places=y) ? :用于保存一個(gè)浮點(diǎn)數(shù),且必須要有兩個(gè)參數(shù),x代表的是總位數(shù),y代表的是小數(shù)點(diǎn)后面的位數(shù)        4、AutoField():添加一條記錄時(shí)會(huì)自增,一般應(yīng)用于主鍵(my_id=models.AutoField(primary_key=True)----主鍵自增)        5、DateField()? :存放日期專門用的(日期格式為x-y-z)        6、TextField() :存放一個(gè)容量很大的文本字段        7、EmailField() :個(gè)帶有檢查Email合法性的 CharField,不接受 maxlength 參數(shù)        8、ImageField()? :存放圖片   5、在數(shù)據(jù)庫(kù)中創(chuàng)建表(將設(shè)計(jì)好的表進(jìn)行創(chuàng)建,在終端上運(yùn)行命令)                      只要運(yùn)行完第一條命令就會(huì)在自己創(chuàng)建項(xiàng)目下的migrations文件夾下產(chǎn)生一條rom表。           只要運(yùn)行完第二條命令就會(huì)吧rom表中的對(duì)應(yīng)信息在數(shù)據(jù)庫(kù)中創(chuàng)建出來。   6、數(shù)據(jù)庫(kù)表記錄的增刪改查           1、向數(shù)據(jù)庫(kù)插入一條記錄            方式1:通過表名.object.create(表字段=前端數(shù)據(jù),表字段=前端數(shù)據(jù))的方式插入記錄                      方式2:通過類屬性賦值然后實(shí)例化產(chǎn)生一個(gè)對(duì)象,最后save的方式來插入記錄          方式3:批量插入數(shù)據(jù)

?

?

      2、向數(shù)據(jù)庫(kù)查詢記錄          方式1:單表查詢           通過all()查詢表中所有的記錄,得到的是個(gè)對(duì)象列表                            通過get()查詢表中某一條記錄,返回結(jié)果有且只有一個(gè),如果符合篩選條件的對(duì)象超過一個(gè)或者沒有都會(huì)拋出錯(cuò)誤。         ?   通過filter()過濾的方式來查詢特定的記錄,返回的結(jié)果是個(gè)列表對(duì)象 由于返回的是個(gè)對(duì)象列表,可以通過.屬性的方式來調(diào)用對(duì)象下的屬性值 也可以通過在models.py的類中添加__str__的方式來直接打印屬性值    其他查詢方式:下面的方法都是對(duì)查詢的結(jié)果再進(jìn)行處理             values(*field): 返回一個(gè)ValueQuerySet對(duì)象,以字典序列的形式返回。        exclude(**kwargs): 它包含了與所給篩選條件不匹配的對(duì)象,取反的意思          order_by(*field): 對(duì)查詢結(jié)果排序             reverse(): 對(duì)查詢結(jié)果反向排序               distinct(): 從返回結(jié)果中剔除重復(fù)紀(jì)錄                  values_list(*field): 它返回的是一個(gè)元組序列。           ?  count(): 返回?cái)?shù)據(jù)庫(kù)中匹配查詢(QuerySet)的對(duì)象數(shù)量。                 first(): 返回第一條記錄                  ?last(): 返回最后一條記錄                 exists(): 如果QuerySet包含數(shù)據(jù),就返回True,否則返回False,只查找到第一條數(shù)據(jù)就返回。        iterator():遍歷查詢數(shù)據(jù)庫(kù)數(shù)據(jù)       補(bǔ)充:django 數(shù)據(jù)庫(kù)的特點(diǎn)             1、django 數(shù)據(jù)庫(kù)的惰性機(jī)制? --.all()或者.filter()等都只是返回了一個(gè)QuerySet(查詢結(jié)果集對(duì)象),它并不會(huì)馬上執(zhí)行sql,而是當(dāng)調(diào)用QuerySet的時(shí)候才執(zhí)行。           2、返回的QuerySet是個(gè)集合對(duì)象,可以對(duì)該對(duì)象進(jìn)行可迭代查詢,也可以對(duì)其進(jìn)行切片操作           3、由于惰性機(jī)制的原因,django數(shù)據(jù)庫(kù)會(huì)有一個(gè)cache緩存機(jī)制,同一時(shí)間內(nèi)發(fā)送兩條相同的sql命令,第一條命令會(huì)從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)然后緩存到cache中,第二條命令就會(huì)在cache中獲取數(shù)據(jù)           4、當(dāng)只是需要判定一個(gè)數(shù)據(jù)是否存在時(shí)就可以用exists()這個(gè)屬性進(jìn)行判定,當(dāng)查詢的數(shù)據(jù)過大時(shí)為了防止數(shù)據(jù)庫(kù)cache撐爆,可以在查詢條件的后面添加iterator()迭代屬性來迭代查詢。           5、 queryset的cache是用于減少程序?qū)?shù)據(jù)庫(kù)的查詢,在通常的使用下會(huì)保證只有在需要的時(shí)候才會(huì)查詢數(shù)據(jù)庫(kù)。 使用exists()和iterator()方法可以優(yōu)化程序?qū)?nèi)存的使用。不過,由于它們并不會(huì)生成queryset cache,可能會(huì)造成額外的數(shù)據(jù)庫(kù)查詢。                        方式2:一對(duì)一查詢之正反向查詢             1、正向查詢格式:               外鍵表名稱.objects.filter(過濾條件).first().外鍵字段名稱.非外鍵表字段()             2、反向查詢格式:               非外鍵表名稱.objects.filter(過濾條件).last().外鍵表名.外鍵字段名()             

      ?? 方式3:一對(duì)多查詢之正反向查詢(通過x_set的方式就可以實(shí)現(xiàn)反向查詢,x指代的是外鍵名稱)

          1、正向查詢:

            外鍵表名稱.objects.filter(過濾條件).first().外鍵字段名稱.非外鍵表字段()

          2、反向查詢:

            非外鍵表名稱.objects.filter(過濾條件).last().外鍵表名__set.外鍵字段名()

           

       ????? 補(bǔ)充:反向查詢得到的是個(gè)集合對(duì)象,而正向查詢得到的是個(gè)對(duì)象。

      了不起的雙下劃線之單表查詢  

      eg:表名.objects.filter(id__lt=10, id__gt=1) ? ? ?   獲取id大于1 且 小于10的值

        表名.objects.filter(id__in=[11, 22, 33]) ? ? ??   獲取id等于11、22、33的數(shù)據(jù)?    

        表名.objects.exclude(id__in=[11, 22, 33])????????? 獲取id不在列表內(nèi)的數(shù)據(jù),而not in是與之相反

        表名.objects.filter(name__contains="x") ? ? ? ? ??? 獲取包含x字段的數(shù)據(jù),

        表名.objects.filter(name__icontains="ven")????  獲取不區(qū)分大小寫的數(shù)據(jù)

    ?  ?? 表名.objects.filter(id__range=[x, y]) ? ???????    獲取id在x到y(tǒng)范圍內(nèi)的數(shù)據(jù)

        范圍bettwen and 、 startswith、istartswith、endswith、 iendswith,

      了不起的雙下劃線(__)之多表?xiàng)l件關(guān)聯(lián)查詢

      ? 正向查找(條件)之一對(duì)多     

      格式:外鍵表名.objects.filter(過濾條件).values("外鍵名稱__非外鍵字段名") 

      正向查找(條件)之多對(duì)多

      格式:外鍵表名.objects.filter(過濾條件).values("外鍵名稱__非外鍵字段名")

     反向查找(條件)

     反向查找之一對(duì)多

      格式:非外鍵表名.objects.filter(外鍵表名__外鍵字段="外鍵字段值").values("非外鍵字段名")                                   

     反向查找之多對(duì)多:

      格式:非外鍵表名.objects.filter(外鍵表名__外鍵字段="外鍵字段值").values("非外鍵字段名")

    ? 總結(jié): 正向查找是先查表,查到的是個(gè)列表對(duì)象,然后再再連表,反向查找是先連表,連到的是個(gè)列表對(duì)象,然后再查表,查表是既可以查自己表中字段也可以查對(duì)端表中字段

     3、向數(shù)據(jù)庫(kù)中刪除記錄             直接刪除(django默認(rèn)支持級(jí)聯(lián)刪除,意思就是說只要?jiǎng)h除該記錄,該記錄對(duì)應(yīng)的外鍵關(guān)系就會(huì)一并刪除)                    注釋:表名.object.filter(過濾條件).具體操作,其中filter內(nèi)寫的是你的過濾條件,id1是表字段,id2是前端模板傳遞過來的過濾條件值,過濾得到的結(jié)果是個(gè)列表,后面可以跟篩選條件([索引值]、first()、last()、delete())來進(jìn)行具體操作       4、向數(shù)據(jù)庫(kù)更新一條數(shù)據(jù)         方式1:通過表名.filter(過濾條件).updae(表字段=值,表字段=值)的方式更新一條記錄或記錄內(nèi)的某行內(nèi)容                方式2:通過save()的方式來更新一條記錄內(nèi)的某行內(nèi)容              注釋:表名.filter(過濾條件).updae(表字段=值,表字段=值),其中過濾條件可以有多個(gè)用逗號(hào)隔開,格式為(表字段=值,表字段=值),過濾結(jié)果也是一個(gè)列表,可以通過篩選條件篩選出自己想要的某條記錄然后對(duì)其進(jìn)行更新。           5、在settings中添加配置記錄數(shù)據(jù)庫(kù)操作             LOGGING = { 'version': 1,                    'disable_existing_loggers': False,                    ?    ??? 'handlers': { 'console':{ 'level':'DEBUG',                   ? ? ?'class':'logging.StreamHandler', }, },                      'loggers': { 'django.db.backends': {                        'handlers': ['console'],                          'propagate': True,                         ? 'level':'DEBUG', }, } }             注釋:只要在settings配置文件的任意位置條件上這條記錄后,數(shù)據(jù)庫(kù)的所有操作都會(huì)被打印出來     7、聚合查詢和分組查詢

      1、聚合查詢 (aggregate),返回的是個(gè)字典形式的值

        1、首先導(dǎo)入相應(yīng)模板:from django.db.models import Avg,Min,Sum,Max

        2、格式:表名稱.objects.[filter(過濾條件)].aggregate([x=]Avg('字段名'))    結(jié)果為: {x:值}

          注釋:x指代的是個(gè)得到的結(jié)果的key鍵的名稱,如果不填寫就自動(dòng)寫字段名作為key名稱

        3、格式:表名稱.objects.filter(過濾條件).aggregate([x=]Avg('字段名1'),([x=]Min('字段名2')([x=]Max('字段名3'))

          注釋:如果想求多個(gè)值就可以用逗號(hào)隔開,得到的結(jié)果是個(gè)字典形式的集合,過濾條件既可以是正向查找也可以是反向查找,還可以

          ge:

          

      2、分組查詢( annotate())         1、首先導(dǎo)入相應(yīng)模板:from django.db.models import Avg,Min,Sum,Max         2、格式:表名稱.objects.[filter(過濾條件)].values(過濾條件).annotate(([x=]Avg('字段名')

          注釋:x指代的是個(gè)得到的結(jié)果的key鍵的名稱,如果不填寫就自動(dòng)寫字段名作為key名稱

        3、格式:表名稱.objects.[filter(過濾條件)].values(過濾條件).aggregate(([x=]Avg('字段名1'),([x=]Min('字段名2'),)

          注釋:如果想求多個(gè)值就可以用逗號(hào)隔開,得到的結(jié)果是個(gè)字典形式的集合,過濾條件既可以是正向查找也可以是反向查找

          ge:

          

      8、F查詢和Q查詢

        1、導(dǎo)入相應(yīng)的模塊:from django.db.models import F,Q

        2、F查詢主要是更新字段中的數(shù)據(jù)用:

          格式:表名稱.object.[filter(過濾條件)].update(表字段名=F("表字段名")+值)

          注釋:主要是對(duì)表字段中的數(shù)字進(jìn)行操作的

          eg:

          

        3、Q查詢主要是應(yīng)對(duì)多個(gè)條件的查詢,分別用& | ~ 操作符來作為多個(gè)條件之間的鏈接介質(zhì)

格式:表名.objects.filter(Q(條件1) 操作符 Q(條件2) 操作符 Q(條件3),Q(條件4),條件5)?
          注釋:&和|可讓多個(gè)Q查詢合并成一個(gè)Q查詢,其中&表示且而|表示或,~表示取反,在所有的Q查詢末尾可以直接跟查詢條件,但是不能放在Q查詢之前。           eg:                9、創(chuàng)建外鍵方法(一對(duì)多記錄,且外鍵必須建立在多的那張表上,比如說一個(gè)出版署出版多本書,外鍵就建立在多的那張表上)       1、方式1:在建表的時(shí)候就已經(jīng)創(chuàng)建好外鍵對(duì)應(yīng)關(guān)系,插入記錄時(shí)就可以直接寫對(duì)端主鍵的值         利用ForeignKey(需要關(guān)聯(lián)的表名)方法來創(chuàng)建外鍵,注意在book類中創(chuàng)建的publish對(duì)象默認(rèn)會(huì)在表中變成publish_id形式的字段         

      2、方式2:建表時(shí)沒有創(chuàng)建外鍵對(duì)應(yīng)關(guān)系,插入記錄的時(shí)候創(chuàng)建外鍵對(duì)應(yīng)關(guān)系,即寫對(duì)端對(duì)應(yīng)的對(duì)象

        1、需要先獲取被綁定的對(duì)象,也就是說創(chuàng)建的外鍵需要綁定那個(gè)對(duì)象

        2、然后在需要綁定外鍵的記錄中將類中對(duì)應(yīng)創(chuàng)建外鍵對(duì)象的值改為獲取的對(duì)象

         

    10、創(chuàng)建外鍵方法(多對(duì)多記錄,第三張表綁定關(guān)系)

      方式1:在建表的時(shí)候就已經(jīng)創(chuàng)建好外鍵對(duì)應(yīng)關(guān)系,因?yàn)槭堑谌龔埍斫壎P(guān)系,所以可以在任意第一張和第二張表中添加對(duì)應(yīng)關(guān)系

          通過ManyToManyField(第二張表名稱)的方式來創(chuàng)建,

             

          django自己創(chuàng)建的第三張表,三個(gè)字段分別為第三張表主鍵,第一張表主鍵,第二張表主鍵

          

         通過add(第一張表記錄1,第一張表記錄2...)的方式向第三張表中添加字段

          

         注釋:首先需要得到第一張表中表多對(duì)多的記錄對(duì)象,然后得到第二張表中多對(duì)多的記錄對(duì)象,最后通過add的方式將兩張表多對(duì)多記錄添加到第三張表中(注意在那個(gè)類中添加多對(duì)多對(duì)象,就用那個(gè)表記錄對(duì)象 添加多對(duì)多記錄)

         也可以通過添加列表的方式添加到第三張表中

         

      方式2:在建表的時(shí)候沒有創(chuàng)建外鍵對(duì)象,需要自己創(chuàng)建第三張表添加多對(duì)多的外鍵

          每個(gè)字段中都添加一對(duì)多的對(duì)應(yīng)關(guān)系,然后就可以django中看見第三張表就可以對(duì)其進(jìn)行具體的操作了。

          通過添加具體的id的方式來創(chuàng)建兩個(gè)字段之間多對(duì)多的關(guān)系。

          

?

    11、解除外鍵方法

      1、方式1:正向刪除(通過clear()的方式來解除外鍵關(guān)系,以及通過remover(對(duì)象)的方式來刪除特定外鍵)

       ??

        注釋:先寫出需要?jiǎng)h除外鍵關(guān)系的表記錄,然后再根據(jù)外鍵綁定對(duì)象來刪除相應(yīng) 的對(duì)應(yīng)關(guān)系

      2、方式2:反向刪除()

       

        注釋:先寫出非外鍵關(guān)系的表記錄,然后根據(jù)book_set反向查找從而刪除相應(yīng)的對(duì)應(yīng)關(guān)系

 五、django的settings配置文件     1、添加靜態(tài)文件(每個(gè)獨(dú)立的項(xiàng)目都應(yīng)該有相應(yīng)的靜態(tài)文件)                      注釋:appbook指的是你的項(xiàng)目文件名,static指的是項(xiàng)目下存放的靜態(tài)文件的文件夾名,其余不變       2、網(wǎng)頁(yè)引入靜態(tài)文件方式         ? 1 、將所有靜態(tài)文件放到一個(gè)static的文件夾中,該文件夾需要手動(dòng)創(chuàng)建(叫什么名字無所謂,但是便于區(qū)分就叫static)
?? ?
??   ? 2 、將static文件夾放到應(yīng)用下,最好是一個(gè)項(xiàng)目對(duì)應(yīng)一個(gè)static的文件夾
?? ?
?? ?   3 、在setting里面設(shè)置引入靜態(tài)文件的方式               STATIC_URL = '/static/'?? ?? 靜態(tài)文件的路徑別名,就是前段引入靜態(tài)文件時(shí)的名稱

?? ??? ?   ?? STATIC_ROOT=(os.path.join(BASE_DIR,"appBook/static"),? )??? 添加上靜態(tài)文件的路徑,django才能找到
?? ??? ?
?? ?    4、 在模板首行加上{% load staticfiles %}??? 相當(dāng)于讀取靜態(tài)文件配置
?? ?
??     5 、 引入文件: {% static 具體路徑 %}???? 相當(dāng)于引入靜態(tài)文件                    注釋:static指的是靜態(tài)文件路徑別名,后面寫的是需要引入的文件           6、需要注意的事項(xiàng):                注意1:為了后端的更改不會(huì)影響前端的引入,避免造成前端大量修改,在前段添加的都是引用名

     STATIC_URL = '/static/' #引用名STATICFILES_DIRS = (os.path.join(BASE_DIR,"statics") ) #實(shí)際名 ,即實(shí)際文件夾的名字#django對(duì)引用名和實(shí)際名進(jìn)行映射,引用時(shí),只能按照引用名來,不能按實(shí)際名去找#<script src="/statics/jquery-3.1.1.js"></script>#------error----不能直接用,必須用STATIC_URL = '/static/'這個(gè)別名引用#<script src="/static/jquery-3.1.1.js"></script>注意2:statics文件夾寫在不同的app下,靜態(tài)文件的調(diào)用,意思就是說當(dāng)settings需要引入多個(gè)靜態(tài)文件時(shí),需要在每個(gè)靜態(tài)文件前加入一個(gè)元素。STATIC_URL = '/static/'STATICFILES_DIRS=(('hello',os.path.join(BASE_DIR,"app01","statics")), )#<script src="/static/hello/jquery-1.8.2.min.js"></script>注意3:要想在網(wǎng)頁(yè)模板中引入靜態(tài)文件就必須先讀取靜態(tài)文件,然后才能引用,且是通過別名引用。STATIC_URL = '/static/'    
        {% load staticfiles %}# <script src={% static "jquery-1.8.2.min.js" %}></script>

?

    

    

?

?

?

?

    

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/xuanan/p/7411083.html

總結(jié)

以上是生活随笔為你收集整理的django目录下的路由系统和视图函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。