天天看點

Django 模型(資料庫)

Django 模型是與資料庫相關的,與資料庫相關的代碼一般寫在 models.py 中,Django 支援 sqlite3, MySQL, PostgreSQL等資料庫,隻需要在settings.py中配置即可,不用更改models.py中的代碼,豐富的API極大的友善了使用。

本節的代碼:(Django 1.6, Python 2.7 測試環境)

Django 模型(資料庫)

learn_models.zip

大家可以按照我的步驟來開始做:

1 2 3

django-admin.py startproject learn_models 

# 建立一個項目

cd

learn_models 

# 進入到該項目的檔案夾

django-admin.py startapp people 

# 建立一個 people 應用(app)

補充:建立app也可以用 python manage.py startapp people, 需要指出的是,django-admin.py 是安裝Django後多出的一個指令,并不是指一個 django-admin.py 腳本在目前目錄下。

那麼project和app什麼關系呢,一個項目一般包含多個應用,一個應用也可以用在多個項目中。

将我們建立的應用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這麼一個應用。

1 2 3 4 5 6 7 8 9 10

INSTALLED_APPS 

=

(

'django.contrib.admin'

,

'django.contrib.auth'

,

'django.contrib.contenttypes'

,

'django.contrib.sessions'

,

'django.contrib.messages'

,

'django.contrib.staticfiles'

,

'people'

,

)

我們打開 people/models.py 檔案,修改其中的代碼如下:

1 2 3 4 5

from

django.db 

import

models

class

Person(models.Model):

name 

=

models.CharField(max_length

=

30

)

age 

=

models.IntegerField()

我們建立了一個Person類,繼承自models.Model, 一個人有姓名和年齡。這裡用到了兩種Field,更多Field類型可以參考教程最後的連結。

我們來同步一下資料庫

1 2 3 4 5

python manage.py syncdb 

# 進入 manage.py 所在的那個檔案夾下輸入這個指令

注意:Django 1.7 及以上的版本需要用以下指令

python manage.py makemigrations

python manage.py migrate

Django 模型(資料庫)

我們會看到,Django生成了一系列的表,也生成了我們建立的people_person這個表,那麼如何使用這個表呢?

Django提供了豐富的API, 下面示範如何使用它。

1 2 3 4 5 6

$ python manage.py shell

>>> 

from

people.models 

import

Person

>>> Person.objects.create(name

=

"WeizhongTu"

, age

=

24

)

<Person: Person 

object

>

>>>

我們建立了一個使用者WeizhongTu 那麼如何從資料庫是查詢到它呢?

1 2 3

>>> Person.objects.get(name

=

"WeizhongTu"

)

<Person: Person 

object

>

>>>

我們用了一個 .objects.get() 方法查詢出來符合條件的對象,但是大家注意到了沒有,查詢結果中顯示<Person: Person object>,這裡并沒有顯示出與WeizhongTu的相關資訊,如果使用者多了就無法知道查詢出來的到底是誰,查詢結果是否正确,我們重新修改一下 people/models.py

name 和 age 等字段中不能有 __(雙下劃線,因為在Django QuerySet API中有特殊含義(用于關系,包含,不區分大小寫,以什麼開頭或結尾,日期的大于小于,正則等)

也不能有Python中的關鍵字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因為它是Python的關鍵字( import keyword; print(keyword.kwlist) 可以打出所有的關鍵字)

1 2 3 4 5 6 7 8 9 10

from

django.db 

import

models

class

Person(models.Model):

name 

=

models.CharField(max_length

=

30

)

age 

=

models.IntegerField()

def

__unicode__(

self

):

# 在Python3中使用 def __str__(self)

return

self

.name

按CTRL + C退出目前的Python shell, 重複上面的操作,我們就可以看到:

Django 模型(資料庫)

建立一個對象的方法有以下幾種:

  1. Person.objects.create(name=name,age=age)
  2. p = Person(name="WZ", age=23)

    p.save()

  3. p = Person(name="TWZ")

    p.age = 23

    p.save()

  4. Person.objects.get_or_create(name="WZT", age=23)

    這種方法是防止重複很好的方法,但是速度要相對慢些,傳回一個元組,第一個為Person對象,第二個為True或False, 建立時傳回的是True, 已經存在時傳回False.

擷取對象有以下方法:

  1. Person.objects.all()
  2. Person.objects.all()[:10] 切片操作,擷取10個人,不支援負索引,切片可以節約記憶體
  3. Person.objects.get(name=name)

    get是用來擷取一個對象的,如果需要擷取滿足條件的一些人,就要用到filter

  4. Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴格等于 "abc" 的人
  5. Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
  6. Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
  7. Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫
  8. Person.objects.filter(name__regex="^abc") # 正規表達式查詢
  9. Person.objects.filter(name__iregex="^abc")# 正規表達式不區分大小寫

    filter是找出滿足條件的,當然也有排除符合某條件的

  10. Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
  11. Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的

參考文檔:

Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/

Fields相關官方文檔:https://docs.djangoproject.com/en/dev/ref/models/fields/