yuhuis

Django 学习二 模型 model

Django 模型的基础知识:

  • 每个模型是个Python类,继承django.db.models.Model类。
  • 该模型的每个属性表示一个数据库表字段。
  • 所有这一切,已经给你自动生成了访问数据库的API

(引用自:Web接口开发与自动化测试——基于Python语言   虫师编著)

看完下面的知识点,回头再体会下基础知识的含义,温故而知新哦。

1.完成表创建

打开../sign/models.py文件,通过模型完成表的创建

 

 可参考官方文档:https://docs.djangoproject.com/en/1.10/ref/models/fields/

 

(引用自:Web接口开发与自动化测试——基于Python语言   虫师编著)

2.admin后台管理

通过Admin后台管理用户/用户组非常方便。创建的发布会和嘉宾表同样可以通过Admin后台管理。

打开../sign/admin.py文件。

http://127.0.0.1:8000/admin/(admin后台登录请参考:https://www.cnblogs.com/yuhuis/p/15874248.html)

 

 展示更多字段和增加搜索栏和过滤器:修改../sign/admin.py文件

 

 3.基本数据访问(表数据增删查改)

以下是Dos命令实践记录,每一步都有注释:

 

D:\>cd guest  # 打开项目文件夹

D:\guest>python manage.py shell  # 运行manage.py提供的shell命令
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from sign.models import Event,Guest  #导入sign应用的Model的Event类和Guest类
>>> Event.objects.all
<bound method BaseManager.all of <django.db.models.manager.Manager object at 0x00000278FE2539D0>>
>>> Event.objects.all()  # 数据集查询all要带括号
<QuerySet [<Event: YH时装发布会>]>
>>> Event.objects.create(id=3,name=\'夏装发布会\',limit=500,status=True,address=\'广州会展中心\',start_time=datetime(2016,9,22,14,0,0))
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name \'datetime\' is not defined
>>> from datetime import datetime   # datetime包是要先导入的
>>> Event.objects.create(id=3,name=\'夏装发布会\',limit=500,status=True,address=\'广州会展中心\',start_time=datetime(2016,9,22,14,0,0))
D:\Software\Python\lib\site-packages\django\db\models\fields\__init__.py:1409: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2016-09-22 14:00:00) while time zone support is active.
warnings.warn("DateTimeField %s received a naive datetime (%s)"
<Event: 夏装发布会>
>>> el=Event.objects.get(name=\'夏装发布会\'))  # 精确查询
>>> el
<Event: 夏装发布会>
>>> el01 = Event.objects.get(name=\'冬装\')   # 精确查询 当数据不存在是会报异常DoesNotExist的
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\Software\Python\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 439, in get
raise self.model.DoesNotExist(
sign.models.Event.DoesNotExist: Event matching query does not exist.
>>> el02 = Event.objects.filter(name_contains=\'夏装\')  #模糊查询 注意字段名和contains之间用双下划线连接,否则报异常 Cannot resolve keyword
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\Software\Python\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 974, in filter
return self._filter_or_exclude(False, args, kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 992, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 999, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "D:\Software\Python\lib\site-packages\django\db\models\sql\query.py", line 1375, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "D:\Software\Python\lib\site-packages\django\db\models\sql\query.py", line 1396, in _add_q
child_clause, needed_inner = self.build_filter(
File "D:\Software\Python\lib\site-packages\django\db\models\sql\query.py", line 1271, in build_filter
lookups, parts, reffed_expression = self.solve_lookup_type(arg)
File "D:\Software\Python\lib\site-packages\django\db\models\sql\query.py", line 1099, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "D:\Software\Python\lib\site-packages\django\db\models\sql\query.py", line 1522, in names_to_path
raise FieldError("Cannot resolve keyword \'%s\' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword \'name_contains\' into field. Choices are: address, create_time, guest, id, limit, name, start_time, status
>>> el02 = Event.objects.filter(name__contains=\'夏装\') # 模糊查询成功
>>> el02
<QuerySet [<Event: 夏装发布会>]>
>>> Guest.objects.create(realname=\'张三\',phone=\'13611010132\',email=\'13611010132@mail.com\',sign=True,event=3)   # Guest.event 是外键 ID的写法 是event_id
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\Software\Python\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 455, in create
obj = self.model(**kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\base.py", line 489, in __init__
_setattr(self, field.name, rel_obj)
File "D:\Software\Python\lib\site-packages\django\db\models\fields\related_descriptors.py", line 215, in __set__
raise ValueError(
ValueError: Cannot assign "3": "Guest.event" must be a "Event" instance.
>>>  Guest.objects.create(realname=\'张三\',phone=\'13611010132\',email=\'13611010132@mail.com\',sign=True,event_id=1)  # 命令行前多了一个空格 报缩进异常IndentationError
File "<console>", line 1
Guest.objects.create(realname=\'张三\',phone=\'13611010132\',email=\'13611010132@mail.com\',sign=True,event=1)
^
IndentationError: unexpected indent
>>> Guest.objects.create(realname=\'张三\',phone=\'13611010132\',email=\'13611010132@mail.com\',sign=True,event_id=1)
<Guest: Guest object (2)>
>>> Guest.objects.create(realname=\'张三\',phone=\'13611010122\',email=\'13611010122@mail.com\',sign=True,event_id=1)
<Guest: Guest object (3)>

>>> Guest.objects.get(phone=\'88888888\').delete()  # 精确删除数据 当删除的数据不存在会报异常 DoesNotExist

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\Software\Python\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Software\Python\lib\site-packages\django\db\models\query.py", line 439, in get
raise self.model.DoesNotExist(
sign.models.Guest.DoesNotExist: Guest matching query does not exist.
>>> Guest.objects.get(phone=\'13611010122\').delete()  # 精确删除数据成功
(1, {\'sign.Guest\': 1})
>>> Guest.objects.select_for_update().filter(phone=\'13611010132\').update(realname=\'李四\')  # 修改更新指定数据
1
>>>

 

分类:

技术点:

相关文章: