本節(jié)的代碼:(Django 1.6, Python 2.7 測(cè)試環(huán)境)
大家可以按照我的步驟來(lái)開(kāi)始做:
django-admin.py startproject learn_models # 新建一個(gè)項(xiàng)目cd learn_models # 進(jìn)入到該項(xiàng)目的文件夾django-admin.py startapp people # 新建一個(gè) people 應(yīng)用(app)
補(bǔ)充:新建app也可以用 python manage.py startapp people, 需要指出的是,django-admin.py 是安裝Django后多出的一個(gè)命令,并不是指一個(gè) django-admin.py 腳本在當(dāng)前目錄下。
那么project和app什么關(guān)系呢,一個(gè)項(xiàng)目一般包含多個(gè)應(yīng)用,一個(gè)應(yīng)用也可以用在多個(gè)項(xiàng)目中。
將我們新建的應(yīng)用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這么一個(gè)應(yīng)用。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'people',)
我們打開(kāi) people/models.py 文件,修改其中的代碼如下:
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField()
我們新建了一個(gè)Person類,繼承自models.Model, 一個(gè)人有姓名和年齡。這里用到了兩種Field,更多Field類型可以參考教程最后的鏈接。
我們來(lái)同步一下數(shù)據(jù)庫(kù)(我們使用默認(rèn)的數(shù)據(jù)庫(kù) SQLite3,無(wú)需配置)
python manage.py syncdb # 進(jìn)入 manage.py 所在的那個(gè)文件夾下輸入這個(gè)命令注意:Django 1.7 及以上的版本需要用以下命令python manage.py makemigrationspython manage.py migrate
我們會(huì)看到,Django生成了一系列的表,也生成了我們新建的people_person這個(gè)表,那么如何使用這個(gè)表呢?
Django提供了豐富的API, 下面演示如何使用它。
$ python manage.py shell>>> from people.models import Person>>> Person.objects.create(name="WeizhongTu", age=24)<Person: Person object>>>>
我們新建了一個(gè)用戶WeizhongTu 那么如何從數(shù)據(jù)庫(kù)是查詢到它呢?
>>> Person.objects.get(name="WeizhongTu")<Person: Person object>>>>
我們用了一個(gè) .objects.get() 方法查詢出來(lái)符合條件的對(duì)象,但是大家注意到了沒(méi)有,查詢結(jié)果中顯示<Person: Person object>,這里并沒(méi)有顯示出與WeizhongTu的相關(guān)信息,如果用戶多了就無(wú)法知道查詢出來(lái)的到底是誰(shuí),查詢結(jié)果是否正確,我們重新修改一下 people/models.py
name 和 age 等字段中不能有 __(雙下劃線,因?yàn)樵贒jango QuerySet API中有特殊含義(用于關(guān)系,包含,不區(qū)分大小寫(xiě),以什么開(kāi)頭或結(jié)尾,日期的大于小于,正則等)
也不能有Python中的關(guān)鍵字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因?yàn)樗荘ython的關(guān)鍵字( import keyword; print(keyword.kwlist) 可以打出所有的關(guān)鍵字)
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField() def __unicode__(self): # 在Python3中使用 def __str__(self) return self.name
按CTRL + C退出當(dāng)前的Python shell, 重復(fù)上面的操作,我們就可以看到:
新建一個(gè)對(duì)象的方法有以下幾種:
Person.objects.create(name=name,age=age)
p = Person(name="WZ", age=23)
p.save()
p = Person(name="TWZ")
p.age = 23
p.save()
Person.objects.get_or_create(name="WZT", age=23)
這種方法是防止重復(fù)很好的方法,但是速度要相對(duì)慢些,返回一個(gè)元組,第一個(gè)為Person對(duì)象,第二個(gè)為True或False, 新建時(shí)返回的是True, 已經(jīng)存在時(shí)返回False.
獲取對(duì)象有以下方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,獲取10個(gè)人,不支持負(fù)索引,切片可以節(jié)約內(nèi)存
Person.objects.get(name=name)
get是用來(lái)獲取一個(gè)對(duì)象的,如果需要獲取滿足條件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴(yán)格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區(qū)分大小寫(xiě),可以找到 ABC, Abc, aBC,這些都符合條件
Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區(qū)分大小寫(xiě)
Person.objects.filter(name__regex="^abc") # 正則表達(dá)式查詢
Person.objects.filter(name__iregex="^abc")# 正則表達(dá)式不區(qū)分大小寫(xiě)
filter是找出滿足條件的,當(dāng)然也有排除符合某條件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對(duì)象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的
參考文檔:
Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/
Fields相關(guān)官方文檔:https://docs.djangoproject.com/en/dev/ref/models/fields/
聯(lián)系客服