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)境
virtualenv和virtualenvwrapper都可以用來(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)有一些基本的配置文件:
目錄說(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)包含一些配置文件:
創(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ù))
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()