• 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:Python35libsite-packagesdjangodbmodelsfields\__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:Python35libsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method

    return getattr(self.get_queryset(), name)(*args, **kwargs)
    File "C:Python35libsite-packagesdjangodbmodelsquery.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')

  • 相关阅读:
    程序员修炼之道:从小工到专家
    2020.12.16收获
    2020.12.15收获
    2020.12.14收获
    2020.12.13收获
    Android学习第二天——对Android的简单了解
    Java学习12.18
    考试加分项
    Java学习12.17
    Java建议
  • 原文地址:https://www.cnblogs.com/lhdcg/p/9942783.html
Copyright © 2020-2023  润新知