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

page66image1655856page66image1772480page66image1655232page66image1777632

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= '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 类型错误。

page67image1601776page67image1787936page67image1663760

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

page68image1774048page68image1674784page68image1774496page68image1670208

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' 。

page69image1782784page69image1668128page69image1776288page69image1632768page69image1780096

......

69

page70image3688736

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

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

 

posted @ 2018-11-11 17:48  拉轰地炒锅  阅读(164)  评论(0编辑  收藏  举报