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'] #過濾器
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
66
蟲師原創----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 型別錯誤。
67
通過 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
68
蟲師原創----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' 。
......
69
>>> g3=Guest.objects.get(phone='13611001101') >>> g3.realname='andy2'
>>> g3.save()
>>> Guest.objects.select_for_update().filter(phone='13611001101').update( realname='andy')