Django使用手冊(cè)

Django教程

Python是我學(xué)習(xí)的第一門編程語(yǔ)言,這兩天剛剛學(xué)完python的WEB-django框架所宰,參考其他書友的教程绒尊,結(jié)合自己的理解,對(duì)其進(jìn)行簡(jiǎn)單的歸納總結(jié)仔粥。

一.搭建虛擬環(huán)境婴谱。

1.為什么使用虛擬環(huán)境?

一臺(tái)電腦上可能有多個(gè)項(xiàng)目躯泰,項(xiàng)目之間所使用的Django版本可能不同谭羔,這時(shí)就需要使用虛擬環(huán)境來(lái)創(chuàng)建想對(duì)獨(dú)立的python環(huán)境

virtualenvvirtualenvwrapper都可以用來(lái)創(chuàng)建虛擬環(huán)境,只是由于virtualenv用起來(lái)有點(diǎn)麻煩麦向,所以wrapper對(duì)它進(jìn)行了封裝口糕,讓它更好用,最終我們使用wrapper提供的命令磕蛇,但是實(shí)際工作都是virtualenv做的景描。

virtualenvwrapper的好處是十办,把虛擬環(huán)境全局管理起來(lái)了,不用針對(duì)每個(gè)項(xiàng)目建立超棺。同一類項(xiàng)目(使用的django版本相同)可以建立同樣的虛擬環(huán)境向族,也不用管它在哪,直接一個(gè)workon就可以棠绘。

2.如何安裝配置虛擬環(huán)境件相?


Window 10平臺(tái)

需要安裝兩個(gè)python模塊

pip install virtualenv

pip install virtualenvwrapper-win


需要配置環(huán)境變量(默認(rèn)虛擬環(huán)境會(huì)建立在系統(tǒng)c盤,不推薦)

實(shí)質(zhì)為配置虛擬環(huán)境生成的位置

配置環(huán)境變量:

此電腦-》右鍵屬性-》高級(jí)設(shè)置-》高級(jí)-》環(huán)境變量

點(diǎn)擊系統(tǒng)變量下方的新建按鈕,打開創(chuàng)建窗口

變量名:WORKON_HOME

變量值:虛擬環(huán)境存放路徑(創(chuàng)建的用來(lái)作虛擬環(huán)境的空文件夾命名必須是英文,不能出現(xiàn)任何中文氧苍,最好是創(chuàng)建在一個(gè)磁盤的根路徑下)


運(yùn)行管理員窗口:

常用命令:

創(chuàng)建虛擬環(huán)境:mkvirtualenv環(huán)境名

切換虛擬環(huán)境: ???workon 環(huán)境名

查看所有虛擬環(huán)境: ?lsvirtualenv

刪除虛擬環(huán)境: ?rmvirtualenv?環(huán)境名

退出虛擬環(huán)境:deactivate

3.django安裝(在虛擬環(huán)境下)

一般來(lái)說(shuō)夜矗,選擇長(zhǎng)期支持版本比較好。

pip install django==1.8.2

pip install Django==2.0.3

pip install django

檢查是否安裝成功

進(jìn)入python環(huán)境让虐,運(yùn)行如下代碼:

import django

django.get_version()

二.Django開發(fā)流程

1.新建項(xiàng)目 :

django-admin startproject 項(xiàng)目名 這樣會(huì)在當(dāng)前目錄新建一個(gè)目錄紊撕,里面已經(jīng)有一些基本的配置文件:

項(xiàng)目配置文件


目錄說(shuō)明

manage.py:一個(gè)命令行工具,可以使你用多種方式對(duì)Django項(xiàng)目進(jìn)行交互

內(nèi)層的目錄:項(xiàng)目的真正的Python包

_init _.py:一個(gè)空文件赡突,它告訴Python這個(gè)目錄應(yīng)該被看做一個(gè)Python包

settings.py:項(xiàng)目的配置文件(如配置數(shù)據(jù)庫(kù))

urls.py:項(xiàng)目的URL聲明

wsgi.py:項(xiàng)目與WSGI兼容的Web服務(wù)器入口

2.新建APP:

?django-admin startapp APP名稱 如果是搭建一個(gè)非常簡(jiǎn)單的應(yīng)用对扶,那么不使用APP也行,只需要吧路由指向目標(biāo)view就可以了惭缰,但是如果要搭建復(fù)雜的應(yīng)用并且需要良好的隔離性浪南,那最好使用APP。同樣漱受,使用該命令也會(huì)在當(dāng)前目錄下新建一個(gè)目錄络凿,里面已經(jīng)包含一些配置文件:


應(yīng)用配置文件

創(chuàng)建APP后,需要在主配置文件settings.py里面的INSTALLED_APPS里面添加該APP的名稱

3.Pycharm使用指定的虛擬環(huán)境打開上述項(xiàng)目

選中導(dǎo)航欄中的File右鍵單擊打開選擇Settings-->Project-->project interpreter-->設(shè)置按鈕——》打開Add python interpreter窗口——》選擇System interpreter--》在右邊的Base interpreter:選項(xiàng)中點(diǎn)擊右邊的三個(gè)點(diǎn)打開找到虛擬環(huán)境的文件位置昂羡,找到python.exe選中

4.數(shù)據(jù)庫(kù)

Django同很多框架一樣使用了ORM(Object Relational Mapping喷众,對(duì)象關(guān)系映射)的方式,每個(gè)model類代表一張數(shù)據(jù)庫(kù)的表紧憾,每一個(gè)屬性代表其一個(gè)字段(這種特性的實(shí)現(xiàn)依賴于python的元類)到千。

數(shù)據(jù)表定義

在APP(應(yīng)用)配置文件models.py中新建模型類),如:定義一張商品表

商品表

當(dāng)建立好models過(guò)后赴穗,執(zhí)行如下遷移命令就可以在數(shù)據(jù)庫(kù)中新建或更新數(shù)據(jù)表了:

生成遷移文件:根據(jù)模型類生成sql語(yǔ)句

python manage.py makemigrations

執(zhí)行遷移:執(zhí)行sql語(yǔ)句生成數(shù)據(jù)表

python manage.py migrate

注:在已經(jīng)遷移的數(shù)據(jù)模型中添加字段憔四,再次進(jìn)行遷移,那么新添加的數(shù)據(jù)必須要允許null或者設(shè)置默認(rèn)值般眉,否則會(huì)報(bào)錯(cuò)了赵,這其實(shí)是為了保護(hù)已經(jīng)存在了的數(shù)據(jù),當(dāng)然在添加完該字段后把null去掉再更新數(shù)據(jù)庫(kù)就可以了甸赃。

字段類型

注:Django默認(rèn)為每張表設(shè)置了一個(gè)int(11)的自增主鍵(即id)柿汛,不需要自己去定義了。

常用類型

# 數(shù)字類型:

AutoField:一個(gè)根據(jù)實(shí)際ID自動(dòng)增長(zhǎng)的IntegerField,通常不指定络断;如果不指定裁替,一個(gè)主鍵字段將自動(dòng)添加到模型中

IntegerField? ? (默認(rèn)長(zhǎng)度為11)的整數(shù)

PositiveIntegerField:

SmallIntegerField

PositiveSmallIntegerField

BigIntegerField:

BinaryField:

BooleanField:true/false 字段,此字段的默認(rèn)表單控制是CheckboxInput

NullBooleanField:支持null貌笨、true弱判、false三種值

DecimalField(max_digits=None, decimal_places=None):使用python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù);DecimalField.max_digits:位數(shù)總數(shù) 锥惋;DecimalField.decimal_places:小數(shù)點(diǎn)后的數(shù)字位數(shù)

FloatField:用Python的float實(shí)例來(lái)表示的浮點(diǎn)數(shù)

# 字符類型

CharField(max_length=字符長(zhǎng)度):字符串昌腰,默認(rèn)的表單樣式是 TextInput,

只需要指定枚舉枚舉元組即可膀跌,例如type = models.CharField('類型', choices=CONTENT_TYPE)遭商,其中CONTENT_TYPE=(('a', 'abc'))

TextField:text類型,大文本字段捅伤,一般超過(guò)4000使用劫流,默認(rèn)的表單控件是Textarea

CommaSeparatedIntegerField:用逗號(hào)分隔的整數(shù),我擦暑认,這有用

# 時(shí)間類型

DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date實(shí)例表示的日期(參數(shù)DateField.auto_now:每次保存對(duì)象時(shí)困介,自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間大审,用于"最后一次修改"的時(shí)間戳蘸际,它總是使用當(dāng)前日期,默認(rèn)為false徒扶;

參數(shù)DateField.auto_now_add:當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間粮彤,用于創(chuàng)建的時(shí)間戳,它總是使用當(dāng)前日期姜骡,默認(rèn)為false

該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput. 在管理員站點(diǎn)添加了一個(gè)JavaScript寫的日歷控件导坟,和一個(gè)“Today"的快捷按鈕,包含了一個(gè)額外的invalid_date錯(cuò)誤消息鍵

auto_now_add, auto_now, and default 這些設(shè)置是相互排斥的圈澈,他們之間的任何組合將會(huì)發(fā)生錯(cuò)誤的結(jié)果


TimeField:使用Python的datetime.time實(shí)例表示的時(shí)間惫周,參數(shù)同DateField

DateTimeField() # DATETIME類型,包括了日期和時(shí)間康栈,需要注意的是Django默認(rèn)的TIME_ZONE是UTC递递;在初始化的時(shí)候,格式如"2015-04-27T15:01:00Z"啥么,它屬于python里面的datetime.datetime類型登舞,可分別用year/month/day等獲取時(shí)間。另外Django如果要實(shí)用MySQL里面的TIMESTAMP類型也是用該字段表示悬荣,并且在插入的時(shí)候不能直接插入一個(gè)整數(shù)菠秒,依然只能插入一個(gè)datetime.datetime對(duì)象,用時(shí)間戳的時(shí)候USE_TZ必須為False

FileField:一個(gè)上傳文件的字段

ImageField:繼承了FileField的所有屬性和方法氯迂,但對(duì)上傳的對(duì)象進(jìn)行校驗(yàn)践叠,確保它是個(gè)有效的image

其它很有用的類型:

EmailField:Email郵箱類型FileField:文件類型言缤,不過(guò)不能設(shè)置為primary_key和unique,要使用該字段還有很多需要注意的地方酵熙,具體的見官方文檔

FilePathField:同上ImageFieldIPAddressField:從1.7開始已經(jīng)不建議使用了轧简,應(yīng)該使用下面這個(gè)GenericIPAddressField:

URLField

UUIDField

字段通用參數(shù)

primary_key:若為 True, 則該字段會(huì)成為模型的主鍵字段

null:如果為True,Django 將空值以NULL 存儲(chǔ)到數(shù)據(jù)庫(kù)中匾二,默認(rèn)值是 False

blank:如果為True哮独,則該字段允許為空白,默認(rèn)值是 False

null和blank對(duì)比:null是數(shù)據(jù)庫(kù)范疇的概念察藐,blank是表單驗(yàn)證證范疇的

max_length = 3? ? ? ? ? ?最大長(zhǎng)度皮璧,對(duì)整型無(wú)效

default = ''? ? ? ? ? ? ? 設(shè)置默認(rèn)值

verbose_name =? ? ? ? ?相當(dāng)于備注,如果沒(méi)給出那么就是該字段,當(dāng)然分飞,要指定的話悴务,可以直接第一個(gè)參數(shù)一個(gè)字符串就可以指定了

editable = False/True? ? ? # 是否可編輯

unique:如果為 True, 這個(gè)字段在表中必須有唯一值

auto_now = False/True? ? ? # 用于時(shí)間,每次更新記錄的時(shí)候更新該字段

auto_now_add = False/True? # 用于時(shí)間譬猫,創(chuàng)建新紀(jì)錄的時(shí)候自動(dòng)更新該字段

db_column:字段的名稱讯檐,如果未指定,則使用屬性的名稱

db_index:若值為 True, 則在表中會(huì)為此字段創(chuàng)建索引

help_text:會(huì)在form表單控件中顯示help文本

choices # 很實(shí)用的一個(gè)功能染服,相當(dāng)于存儲(chǔ)一個(gè)枚舉列表别洪,其中左邊的key是實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)中的值,例如柳刮,可以這樣定義一個(gè)字段:YEAR_IN_SCHOOL_CHOICES= (

????????('FR', 'Freshman'),

? ? ? ? ('SO', 'Sophomore'),

? ? ? ? ('JR', 'Junior'),

? ? ? ? ('SR', 'Senior'),

?)? ? ? ??

然后在定義字段的時(shí)候給個(gè)參數(shù)choices=YEAR_IN_SCHOOL_CHOICES挖垛,在插入字段的時(shí)候,使用'RF'這樣的秉颗,在獲取字段值的時(shí)候這樣:p.get_year_in_school_display()即可顯示'Freshman'

verbose_name? ? ? ? # 定義字段的注釋

關(guān)系的類型包括

ForeignKey:一對(duì)多痢毒,將字段定義在多的一端中

ManyToManyField:多對(duì)多,將字段定義在兩端中

OneToOneField:一對(duì)一蚕甥,將字段定義在任意一端中

5.配置項(xiàng)

全局配置

DEBUG =True? ? ? # DEBUG模式? 哪替;項(xiàng)目在開發(fā)過(guò)程中 需要設(shè)置Debug為False 上線部署之后關(guān)閉調(diào)試模式

TEMPLATE_DEBUG =True# TEMPLATE的DEBUG模式

ALLOWED_HOSTS = []# 設(shè)置哪些域名可以訪問(wèn),當(dāng)debug為false時(shí)必須為其指定一個(gè)值菇怀,['*']表示允許所有的訪問(wèn)

INSTALLED_APPS = [默認(rèn)APP+自己的APP]

MIDDLEWARE_CLASSES = [中間件]

ROOT_URLCONF ='admin.urls'# 讀取的默認(rèn)的url文件

TEMPLATES =[ {? 'DIRS': [os.path.join(BASE_DIR,"templates")],? ? }]?配置templates(模塊凭舶,即HTML前端頁(yè)面)

# Database 數(shù)據(jù)庫(kù)的配置:(默認(rèn)自帶sqlite3數(shù)據(jù)庫(kù))

mysql數(shù)據(jù)庫(kù)

LANGUAGE_CODE ='en-us'? ? ? ? ? ?# 語(yǔ)言,中文可用zh-Hans敏释、zh-CN库快,完整列表見:http://www.i18nguy.com/unicode/language-identifiers.html

TIME_ZONE ='Asia/Chongqing'# 時(shí)區(qū)

USE_TZ =False# 數(shù)據(jù)庫(kù)中要使用時(shí)間戳就應(yīng)該關(guān)閉這個(gè)

# Static files (CSS, JavaScript, Images) 靜態(tài)文件目錄

?STATIC_URL ='/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]?配置自己創(chuàng)建的靜態(tài)文件(即js/css/img)

STATIC_ROOT = os.path.join(BASE_DIR,'static')# 這個(gè)選項(xiàng)默認(rèn)是沒(méi)有的,在編碼時(shí)將靜態(tài)文件放在APP中的static目錄下钥顽,部署時(shí)用python manage.py collectstatic就可以把靜態(tài)文件收集到STATIDC_ROOT目錄


# 配置 存儲(chǔ)session使用redis數(shù)據(jù)庫(kù)

# SESSION_ENGINE = 'redis_sessions.session'

# SESSION_REDIS_HOST = 'localhost'

# SESSION_REDIS_PORT = 6379

# SESSION_REDIS_DB = 0

# SESSION_REDIS_PASSWORD = ''

# SESSION_REDIS_PREFIX = 'session'

發(fā)送郵件配置

EMAIL_BACKEND ='django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_TLS =True #是否使用TLS安全傳輸協(xié)議(用于在兩個(gè)通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性义屏。)

EMAIL_USE_SSL =False #是否使用SSL加密,qq企業(yè)郵箱要求使用

EMAIL_HOST ='smtp.163.com' #發(fā)送郵件的郵箱 的 SMTP服務(wù)器,這里用了163郵箱

EMAIL_PORT =25 #發(fā)件箱的SMTP服務(wù)器端口

EMAIL_HOST_USER ='18137128152@163.com' #發(fā)送郵件的郵箱地址

EMAIL_HOST_PASSWORD ='qikuedu'

DEFAULT_FROM_EMAIL ='zzyblog <18137128152@163.com>'? ? ?(發(fā)件人)

請(qǐng)求與響應(yīng)

HttpReqeust對(duì)象

服務(wù)器接收到http協(xié)議的請(qǐng)求后闽铐,會(huì)根據(jù)報(bào)文創(chuàng)建HttpRequest對(duì)象

視圖函數(shù)的第一個(gè)參數(shù)是HttpRequest對(duì)象

在django.http模塊中定義了HttpRequest對(duì)象的API

屬性

下面除非特別說(shuō)明蝶怔,屬性都是只讀的

path:一個(gè)字符串,表示請(qǐng)求的頁(yè)面的完整路徑兄墅,不包含域名

method:一個(gè)字符串踢星,表示請(qǐng)求使用的HTTP方法,常用值包括:'GET'隙咸、'POST'

encoding:一個(gè)字符串沐悦,表示提交的數(shù)據(jù)的編碼方式

如果為None則表示使用瀏覽器的默認(rèn)設(shè)置,一般為utf-8

這個(gè)屬性是可寫的五督,可以通過(guò)修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼藏否,接下來(lái)對(duì)屬性的任何訪問(wèn)將使用新的encoding值

GET:一個(gè)類似于字典的對(duì)象,包含get請(qǐng)求方式的所有參數(shù)

POST:一個(gè)類似于字典的對(duì)象充包,包含post請(qǐng)求方式的所有參數(shù)

FILES:一個(gè)類似于字典的對(duì)象副签,包含所有的上傳文件

COOKIES:一個(gè)標(biāo)準(zhǔn)的Python字典,包含所有的cookie基矮,鍵和值都為字符串

session:一個(gè)既可讀又可寫的類似于字典的對(duì)象淆储,表示當(dāng)前的會(huì)話,只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用家浇,詳細(xì)內(nèi)容見“狀態(tài)保持”

方法

is_ajax():如果請(qǐng)求是通過(guò)XMLHttpRequest發(fā)起的本砰,則返回True

HttpResponse對(duì)象

在django.http模塊中定義了HttpResponse對(duì)象的API

HttpRequest對(duì)象由Django自動(dòng)創(chuàng)建,HttpResponse對(duì)象由程序員創(chuàng)建

不調(diào)用模板蓝谨,直接返回?cái)?shù)據(jù)

from django.http import HttpResponse

def index(request):

return HttpResponse('你好')

調(diào)用模板

from django.http import HttpResponse

from django.template import RequestContext, loader

def index(request):

????????t1 = loader.get_template('polls/index.html')

????????context = RequestContext(request, {'h1': 'hello'})

????????return HttpResponse(t1.render(context))

屬性

content:表示返回的內(nèi)容灌具,字符串類型

charset:表示response采用的編碼字符集青团,字符串類型

status_code:響應(yīng)的HTTP響應(yīng)狀態(tài)碼

content-type:指定輸出的MIME類型

方法

init :使用頁(yè)內(nèi)容實(shí)例化HttpResponse對(duì)象

write(content):以文件的方式寫

flush():以文件的方式輸出緩存區(qū)

set_cookie(key, value='', max_age=None, expires=None):設(shè)置Cookie

key譬巫、value都是字符串類型

max_age是一個(gè)整數(shù),表示在指定秒數(shù)后過(guò)期

expires是一個(gè)datetime或timedelta對(duì)象督笆,會(huì)話將在這個(gè)指定的日期/時(shí)間過(guò)期芦昔,注意datetime和timedelta值只有在使用PickleSerializer

時(shí)才可序列化

max_age與expires二選一

如果不指定過(guò)期時(shí)間,則兩個(gè)星期后過(guò)期

from django.http import HttpResponse

from datetime import *

def index(request):

????????response = HttpResponse()

????????if request.COOKIES.has_key('h1'):

????????response.write('

????????' + request.COOKIES['h1'] + '

????????')

????????response.set_cookie('h1', '你好', 120)

????????# response.set_cookie('h1', '你好', None, datetime(2016, 10, 31))

????????return response

delete_cookie(key):刪除指定的key的Cookie娃肿,如果key不存在則什么也不發(fā)生

子類HttpResponseRedirect

重定向咕缎,服務(wù)器端跳轉(zhuǎn)

構(gòu)造函數(shù)的第一個(gè)參數(shù)用來(lái)指定重定向的地址

from django.http import HttpResponse,HttpResponseRedirect

def index2(request,id):

????????print(id,type(id))

? ? ? ?return HttpResponseRedirect("/redirecttest")

簡(jiǎn)寫函數(shù)

render

render(request, template_name[, context])

結(jié)合一個(gè)給定的模板和一個(gè)給定的上下文字典拷肌,并返回一個(gè)渲染后的HttpResponse對(duì)象

request:該request用于生成response

template_name:要使用的模板的完整名稱

context:添加到模板上下文的一個(gè)字典古胆,視圖將在渲染模板之前調(diào)用它

from django.shortcuts import render

def index(req):

????????return render(req, 'booktest/index.html', {'h1': 'hello'})

重定向

redirect(to)

為傳遞進(jìn)來(lái)的參數(shù)返回HttpResponseRedirect

to推薦使用反向解析

from django.shortcuts import redirect

from django.core.urlresolvers import reverse

def index(req):

????????return redirect(reverse('booktest:index2'))


6.路由與視圖

url: web訪問(wèn)請(qǐng)求的入口(相當(dāng)于Laravel里的路由)

view:應(yīng)用的邏輯部分界斜,從客戶端接收請(qǐng)求徒河,處理并返回?cái)?shù)據(jù)仲器,一般返回到template模板進(jìn)行渲染(相當(dāng)于Laravel里的控制器)

將/list定位到booktest這個(gè)APP里面的views里面的list視圖方法來(lái)處理的形式

app_name ="booktest"

urlpatterns = [

url(r'^list/$',list,name="list"),

給url命名可以方便我們進(jìn)行統(tǒng)一修改url樣式获询,比如之前用list的url可以訪問(wèn)到list這個(gè)方法掖棉,但現(xiàn)在如果想改成ls的方式來(lái)訪問(wèn)聂抢,那么由于后端的模板渲染等都是用的其命名list,就無(wú)需修改后端邏輯了

路由按照app分組

首先主urls.py里面使用include包含應(yīng)用下的urls.py文件

from django.conf.urls import include

urlpatterns = [

? ? ????url(r'^app1', include('app1.urls'帖努,namespace='app1')),

]

然后在app1下的urls.py文件里面撰豺,進(jìn)行如下設(shè)置:

from django.conf.urls import url

from . import views

app_name ="app1"

urlpatterns = [

? ? url(r'^/(\d+)$', views.hello,,name="index"), #一個(gè)參數(shù)對(duì)應(yīng)一個(gè)分組。

]

7.ORM增刪改查

ORM代替SQL語(yǔ)句實(shí)現(xiàn)

進(jìn)入shell命令行:? python?manage.py shell

引入所需的模型類?from APP(應(yīng)用名).models import? ?模型類

查詢記錄

Blog.objects.all()# 獲取該表的所有記錄拼余,返回的是記錄對(duì)象組成的列表

Blog.objects.get(pk=1)# 根據(jù)主鍵獲取數(shù)據(jù)

Blog.objects.get(name="")# 只會(huì)找到第一個(gè)匹配的數(shù)據(jù)

Blog.objects.filter(name="")# 這個(gè)就會(huì)找到匹配的多個(gè)數(shù)據(jù)

Blog.objects.filter(name__contains="")# 模糊查找name字段的值污桦,返回列表Blog.objects.order_by("字段1","字段2")# 排序,order_by不加任何參數(shù)表示不需要排序(字段前'+'代表升序匙监,'-'代表降序凡橱。)

Blog.objects.all().order_by("字段")

Blog.objects.count()# 返回記錄總數(shù)

Blog.objects.values('id','name')? # 相當(dāng)于select id name from Blog,返回的是一個(gè)字典Blog.objects.values('name').distinct()? # distinct在django的mysql引擎中無(wú)法對(duì)field進(jìn)行distinct操作亭姥,所以需要這樣做Blog.objects.values_list('id', flat=True)# 查詢?cè)撟侄蔚乃兄挡⑶曳祷氐氖莍d的列表梭纹,而不是包括了名字的字典

Blog.objects.all().defer('title')# 僅僅取某個(gè)字段,這里返回是一個(gè)model對(duì)象Blog.objects.all().only('title')# 僅僅取某個(gè)字段致份,也是返回一個(gè)model對(duì)戲那個(gè)Blog.objects.all().values_list('title')# 僅僅取某個(gè)字段变抽,這里返回一個(gè)數(shù)組

Blog.objects.latest('id')# 根據(jù)某個(gè)字段查找其最后一條記錄,返回的是一個(gè)對(duì)戲那個(gè)氮块,不是id

Blog.objects.filter(time__gte ='2015-07-23', time__lte ='2015-07-24')# 大于等于并且小于等于绍载,不加e表示不能等于

Blog.objects.filter(time__isnull =True)# 判斷某個(gè)字段是否為空

Blog.objects.all().exclude(id=7)# 排除,即不等于Blog.objects.filter('time__year':'2015','time__month':'08','time__day':'17'):按年月日查詢?nèi)掌谔喜酰蓛H查詢其中某一個(gè)條件

增加記錄:

book= BookInfo()

book.title = “神雕俠侶”

book.pub_date = “1998-01-01”

book.save()

修改記錄

修改書標(biāo)題

book.title = “神雕俠侶續(xù)集”

book.save()

刪除記錄

刪除shan圖書

book.delete()

關(guān)聯(lián)查詢

數(shù)據(jù)庫(kù)中存儲(chǔ)外鍵為整形

ORM中外鍵為對(duì)象類型

1.一對(duì)一(關(guān)聯(lián)關(guān)系雙方可隨意定義):

外鍵創(chuàng)建方法:models.OneToOneField()

關(guān)聯(lián)方(關(guān)聯(lián)關(guān)系所在方)查找非關(guān)聯(lián)方:關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)關(guān)系名

非關(guān)聯(lián)方查找關(guān)聯(lián)方:非關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)方類名(小寫)

2.多對(duì)多(關(guān)聯(lián)關(guān)系雙方隨意定義):

外鍵創(chuàng)建方法:models.ManyToManyField()

關(guān)聯(lián)方(關(guān)聯(lián)關(guān)系所在方)查找非關(guān)聯(lián)方:關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)關(guān)系名

非關(guān)聯(lián)方查找關(guān)聯(lián)方:非關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)方類名(小寫)_set.all()

3.一對(duì)多(關(guān)聯(lián)關(guān)系定義在多方):

外鍵創(chuàng)建方法:models.Foreignkey()

關(guān)聯(lián)方(關(guān)聯(lián)關(guān)系所在方)查找非關(guān)聯(lián)方:關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)關(guān)系名

非關(guān)聯(lián)方查找關(guān)聯(lián)方:非關(guān)聯(lián)方對(duì)象.關(guān)聯(lián)方類名小寫_set.all()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末击儡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝠引,更是在濱河造成了極大的恐慌阳谍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螃概,死亡現(xiàn)場(chǎng)離奇詭異矫夯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吊洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門训貌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冒窍,你說(shuō)我怎么就攤上這事递沪。” “怎么了综液?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵款慨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谬莹,道長(zhǎng)檩奠,這世上最難降的妖魔是什么约素? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮笆凌,結(jié)果婚禮上圣猎,老公的妹妹穿的比我還像新娘。我一直安慰自己乞而,他們只是感情好送悔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爪模,像睡著了一般欠啤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋灌,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天洁段,我揣著相機(jī)與錄音,去河邊找鬼共郭。 笑死祠丝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的除嘹。 我是一名探鬼主播写半,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尉咕!你這毒婦竟也來(lái)了叠蝇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤年缎,失蹤者是張志新(化名)和其女友劉穎悔捶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单芜,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜕该,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缓溅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇损。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赁温,死狀恐怖坛怪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情股囊,我是刑警寧澤袜匿,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站稚疹,受9級(jí)特大地震影響居灯,放射性物質(zhì)發(fā)生泄漏祭务。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一怪嫌、第九天 我趴在偏房一處隱蔽的房頂上張望义锥。 院中可真熱鬧,春花似錦岩灭、人聲如沸拌倍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柱恤。三九已至,卻和暖如春找爱,著一層夾襖步出監(jiān)牢的瞬間梗顺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工车摄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寺谤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓吮播,卻偏偏與公主長(zhǎng)得像矗漾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄料,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容