1. 程式人生 > >django模型005

django模型005

除此之外,Admin 管理後臺提供了的很強的定製性,我們甚至可以非常方便生成搜尋欄和過濾器。重新

開啟.../sign/admin.py 檔案,做如下修改。

 

# Register your models here.
class EventAdmin(admin.ModelAdmin):

list_display = ['name', 'status', 'start_time','id'] search_fields = ['name'] #搜尋欄
list_filter = ['status'] #過濾器

class GuestAdmin(admin.ModelAdmin):

list_display = ['realname', 'phone','email','sign','create_time','event'] search_fields = ['realname','phone'] #搜尋欄
list_filter = ['sign'] #過濾器

......

基本資料訪問

manage.py 提供的 shell 命令,可以在該來模式下練習資料庫表

的操作。

python3 manage.py shell

from datetime import datetime

>>> e1 = Event(id=2,name='紅米 Pro 釋出會',limit=2000,status=True,address='北京水立 方',start_time=datetime(2016,8,10,14,0,0))

>>> e1.save() C:\Python35\lib\site-packages\django\db\models\fields\__init__.py:1453:

蟲師原創----http://fnng.cnblogs.com

page66image1655856 page66image1772480 page66image1655232 page66image1777632

66

page67image1656896

蟲師原創----http://fnng.cnblogs.comRuntimeWarning: DateTimeField Event.start_time received a naive datetime

(2016-08-10 14:00:00) while time zone support is active. RuntimeWarning)

因為 start_time 欄位需要設定日期時間,所以匯入和 datetime.datetime()方法。但是,我們收到了一行警告 資訊“RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2016-08-10 14:00:00) while time zone support is active.”

這跟 UTC 有關,如果讀者感興趣可以百度 UTC 是什麼?這裡,我們暫時忽略掉這個問題,最簡單的方 式就是在.../settings.py 檔案中設定:USE_TZ = False。

修改 settings.py 檔案儲存後,需要執行“quit()”命令退出 shell 模式,並重新執行“Python3 manage.py shell” 進入,剛才的設定才會生效。

如果你覺得建立和儲存分兩步完成過於麻煩,也可以通過 table.objects.create()方法將兩步合為一步,方 法如下。

......
>>> Event.objects.create(id=3,name='紅米 MAX 釋出會',limit=2000,status=True, address='北京會展中心',start_time=datetime(2016,9,22,14,0,0))
<Event: 紅米 MAX 釋出會>
>>> Guest.objects.create(realname='andy',phone=13611001101,email= '[email protected]',sign=False,event_id=3)
<Guest: andy>

需要說明的是,表的 id 欄位已經設定了自增,所以,該欄位為空可以新增資料,但在建立嘉賓時資料時 需要指定關聯的釋出會 id。Event 表指定了 id=3,Guest 表指定 event_id=3,所以嘉賓 andy 對應的是紅米 MAX釋出會。

4.3.2、查詢資料查詢無疑是資料庫表中使用頻率最高的操作。

table.objects.get()方法用於從資料庫表中取得一條匹配的結果,返回一個物件,如果記錄不存在的話,那 麼它會報 DoesNotExist 型別錯誤。

page67image1601776 page67image1787936 page67image1663760

67

page68image1635264

通過 name='紅米 MAX 釋出會' 做為查詢條件:

......
>>> e1 = Event.objects.get(name='紅米 MAX 釋出會') >>> e1
<Event: 紅米 MAX 釋出會>
>>> e1.address
'北京會展中心'
>>> e1.start_time
datetime.datetime(2016, 9, 22, 14, 0)
>>>
>>> Event.objects.get(name='紅米 MAX 釋出會').status True
>>> Event.objects.get(name='紅米 MAX 釋出會').limit 2000
>>> Event.objects.get(name='釋出會').address Traceback (most recent call last):

File "<console>", line 1, in <module>

File "C:\Python35\lib\site-packages\django\db\models\manager.py", line 85, in manager_method

return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Python35\lib\site-packages\django\db\models\query.py", line 385, in get

self.model._meta.object_name
sign.models.DoesNotExist: Event matching query does not exist.

因為 name='釋出會' 並沒有完全匹配到釋出會名稱,所以會丟擲 DoesNotExist 異常,但更多的時候希望 使用模糊查詢。

table.objects.filter()方法是從資料庫的取得匹配的結果,返回一個物件列表,如果記錄不存在的話,它會 返回[]。

......
>>> e2 = Event.objects.filter(name__contains='釋出會')
>>> e2
<QuerySet [<Event: 小米 5 釋出會>, <Event: 紅米 Pro 釋出會>, <Event: 紅米 MAX 釋出會>]>

蟲師原創----http://fnng.cnblogs.com

page68image1774048 page68image1674784 page68image1774496 page68image1670208

68

page69image3699760

蟲師原創----http://fnng.cnblogs.com在 name 和 contains 之間用雙下劃線。這裡,contains 部分會被 Django 翻譯成 LIKE 語句。

接下來,通過嘉賓資訊查詢其關聯的釋出會資訊。檢視 phone='13611001101' 這位嘉賓所參加的釋出會信 息:

......

>>> g1 = Guest.objects.get(phone='13611001101') >>> g1.event
<Event: 紅米 MAX 釋出會>
>>> g1.event.name

'紅米 MAX 釋出會'
>>> g1.event.address '北京會展中心'

4.3.3、刪除資料
查詢 phone='13611001101' 的嘉賓,通過 delete()方法刪除。

......

>>> g2 = Guest.objects.get(phone='13611001101') >>> g2.delete()
(1, {'sign.Guest': 1})

>>> Guest.objects.get(phone='13611001101').delete() (1, {'sign.Guest': 1})

4.3.4、更新資料
查詢 phone='13611001101' 的嘉賓,更新 realname='andy2' 。

page69image1782784 page69image1668128 page69image1776288 page69image1632768 page69image1780096

......

69

page70image3688736

>>> g3=Guest.objects.get(phone='13611001101') >>> g3.realname='andy2'
>>> g3.save()

>>> Guest.objects.select_for_update().filter(phone='13611001101').update( realname='andy')