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= 'andy@mail.com',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')