Django 模型是與資料庫相關的,與資料庫相關的代碼一般寫在 models.py 中,Django 支援 sqlite3, MySQL, PostgreSQL等資料庫,隻需要在settings.py中配置即可,不用更改models.py中的代碼,豐富的API極大的友善了使用。
本節的代碼:(Django 1.6, Python 2.7 測試環境)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0xWdhZWZk9lbvNWavw1cldWYtlUZwlHVlxWam9CX05WZth2YhRHdh9CXzd2bsFWak9CXy9GdpRWZ19CXjlGdhR3cvwVbvNmLn5WY0VWd4dmbhlWcppnL3d3dvw1LcpDc0RHaiojIsJye.png)
learn_models.zip
大家可以按照我的步驟來開始做:
1 2 3 | |
補充:建立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 | |
我們打開 people/models.py 檔案,修改其中的代碼如下:
1 2 3 4 5 | |
我們建立了一個Person類,繼承自models.Model, 一個人有姓名和年齡。這裡用到了兩種Field,更多Field類型可以參考教程最後的連結。
我們來同步一下資料庫
1 2 3 4 5 | |
我們會看到,Django生成了一系列的表,也生成了我們建立的people_person這個表,那麼如何使用這個表呢?
Django提供了豐富的API, 下面示範如何使用它。
1 2 3 4 5 6 | |
我們建立了一個使用者WeizhongTu 那麼如何從資料庫是查詢到它呢?
1 2 3 | |
我們用了一個 .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 | |
按CTRL + C退出目前的Python shell, 重複上面的操作,我們就可以看到:
建立一個對象的方法有以下幾種:
- 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)
這種方法是防止重複很好的方法,但是速度要相對慢些,傳回一個元組,第一個為Person對象,第二個為True或False, 建立時傳回的是True, 已經存在時傳回False.
擷取對象有以下方法:
- Person.objects.all()
- Person.objects.all()[:10] 切片操作,擷取10個人,不支援負索引,切片可以節約記憶體
-
Person.objects.get(name=name)
get是用來擷取一個對象的,如果需要擷取滿足條件的一些人,就要用到filter
- Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴格等于 "abc" 的人
- Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
- Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
- Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫
- Person.objects.filter(name__regex="^abc") # 正規表達式查詢
-
Person.objects.filter(name__iregex="^abc")# 正規表達式不區分大小寫
filter是找出滿足條件的,當然也有排除符合某條件的
- Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
- 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/