PythonWeb开发基础教程-第4章-模型和数据库课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《PythonWeb开发基础教程-第4章-模型和数据库课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PythonWeb 开发 基础教程 模型 数据库 课件
- 资源描述:
-
1、Python Web开发基础教程(Django版)第4章 模型和数据库本章主要内容:模型基础模型基础数据操作索引特殊查询表达式执行原始SQL查询关系4.1模型基础 模型是项目的数据来源。每个模型都是一个Python类,并且映射到一个数据库表。模型的每个属性相当于数据库表的一个字段。使用模型对象可完成各种数据库表操作。本节主要内容 定义模型 模型配置 迁移数据库 定义字段4.1.1定义模型定义模型就是实现一个django.db.models.Model类的子类。模型的文件名称默认为models.py,也可使用其他名称。实例:创建项目chapter4和应用faqs,在应用faqs中定义模型类faq
2、sdata。具体操作步骤:演示4.1.2模型配置 要使用模型,还需要在项目配置文件settings.py中完成相应的设置。首先,需要在项目配置文件的INSTALLED_APPS变量中添加包含模型的应用名称,代码如下。INSTALLED_APPS=,faqs,其次,需要在项目配置文件的DATABASES变量中设置数据库信息,项目默认的数据库配置信息如下。DATABASES=default:ENGINE:django.db.backends.sqlite3,NAME:os.path.join(BASE_DIR,db.sqlite3),MySQL数据库的配置如下。DATABASES=default:
3、ENGINE:django.db.backends.mysql,NAME:mysqldb,USER:sqldbuser1,PASSWORD:sqldbpassword1,HOST:,PORT:,Oracle数据库的配置如下。DATABASES=default:ENGINE:django.db.backends.oracle,NAME:myordb,USER:ordbuser1,PASSWORD:ordbpassword1,HOST:127.0.0.1,PORT:1540,PostgreSQL数据库的配置如下。DATABASES=default:ENGINE:django.db.backends
4、.postgresql,NAME:mypsdb,USER:psdbuser1,PASSWORD:psdbpassworda1,HOST:127.0.0.1,PORT:5432,4.1.3迁移数据库 完成模型的定义和配置后,在使用数据库之前,还需执行数据库迁移操作。Django通过迁移操作将模型的更改(模型定义、模型删除、字段更改等)应用到数据库。首先,执行makemigrations命令,根据模型的更改情况生成迁移文件。E:chapter4python manage.py makemigrations 生成迁移文件后,执行migrate命令,应用迁移文件完成迁移操作 E:chapter4pyt
5、hon manage.py migrate4.1.4定义字段 字段的定义包括字段名、字段类型和字段选项 示例代码如下。question=models.CharField(max_length=200,blank=True)其中,question为字段名,CharField为字段类型,max_length和blank为字段选项。Django在django.db.models.fields模块中定义了可用的字段类型。为了方便,Django已将fields模块导入到django.db.models模块中。通常,先用from django.db import models 导入models模块,然后用
6、models.xxxField来引用字段类型。表4-1字段类型字段类型字段类型说明说明AutoField自动增量,32位整数,取值范围是1231-1BigAutoField自动增量,64位整数,取值范围是1263-1BigIntegerField64位整数,取值范围是-263263-1。字段的默认表单控件为TextInputBinaryField存储原始二进制数据BooleanField存储True或False。字段的默认表单控件为CheckboxInputCharField存储字符串。字段的默认表单控件为TextInputDateField存储日期,字段值为datetime.date实例。字
7、段的默认表单控件为TextInputDateTimeField存储日期时间,字段值为datetime.datetime实例。字段的默认表单控件为TextInputDecimalField存储固定精度的十进制数字段,字段值为Decimal实例。字段的默认表单控件为NumberInputDurationField存储时间段EmailField存储E-mail地址FileField存储文件。字段的默认表单控件为ClearableFileInputFilePathField存储文件路径FloatField存储浮点数字。字段的默认表单控件为NumberInputImageField存储图片。字段的默认表
8、单控件为ClearableFileInput表4-1字段类型(续)字段类型字段类型说明说明IntegerField存储整数。取值范围是-231231-1。字段的默认表单控件为NumberInputGenericIPAddressField存储字符串格式的IPv4或IPv6地址。字段的默认表单控件为TextInputPositiveIntegerField存储非负整数。取值范围是0231-1PositiveSmallIntegerField存储非负小整数。取值范围是0215-1SlugField存储Slug数据,只包含字母、数字、下划线或连字符SmallIntegerField存储小整数。取值范
9、围是-215215-1TextField存储大量文本。字段的默认表单控件为TextareaTimeField存储时间,字段值为datetime.time实例。字段的默认表单控件为TextInputURLField存储URL。字段的默认表单控件为TextInputUUIDField存储唯一标识符,字段值为UUID类实例表4-2字段选项选项选项说明说明null默认为False。为True时,Django在字段无数据时将空值NULL存入数据库(字符串字段存入空字符串)blank默认为False。为True时,字段允许为空,即表单验证将允许输入空值。blank影响数据验证,null影响数据库数据存储c
10、hoices为字段定义选择项。字段值为选择项中的列表或元组中的值db_column定义字段在数据库表中的列名称。未设置时,Django用模型中的字段名作为数据库表列名称db_index为True时,为该字段创建数据库索引db_tablespace若为字段创建了索引,则为字段索引设置数据库的表空间名称default设置字段默认值editable默认是True。为False时,字段不在模型表单中显示error_messages设置错误提示信息。该设置会覆盖默认的错误提示信息help_text设置字段的帮助信息primary_key设置为True时,字段成为模型的主键。unique设置为True时,
11、字段值在整个表中必须是唯一的unique_for_date设置为日期或日期时间字段名,关联的两个字段值在整个表中必须是唯一的unique_for_month类似unique_for_date。与关联的月份唯一unique_for_year类似unique_for_date。与关联的年份唯一verbose_name为字段设置备注名称validators为字段设置校验器4.2 数据操作 在完成模型定义和数据库迁移操作后,数据库中有了与模型一致的表,便可进一步执行数据操作,包括添加数据、获取数据、更新数据和删除数据。也可使用可视化工具(如Visual Studio)来管理数据。本节主要内容 在Vis
12、ual Studio中管理SQLite数据库 添加数据 获取数据 字段查找 更新数据 删除数据 查询集操作4.2.14.2.1在在Visual StudioVisual Studio中管理中管理SQLiteSQLite数据库数据库使用第三方组件dotConnect for SQLite,可在Visual Studio中管理SQLite数据库。1 1安装件安装件dotConnectdotConnect for SQLite for SQLite2 2连接到连接到SQLiteSQLite数据库数据库Visual Studio使用服务器资源管理器管理服务器和数据连接。3 3检索数据检索数据 鼠标右键
13、单击要查看数据的表(如faqs_faqsdata),然后选择“检索数据”命令,可打开查询设计器窗口。查询设计器窗口默认显示了表的数据,可在其中修改、添加或删除数据。修改数据:在表格中直接修改现有数据,修改后按【Enter】键或单击当前行之外的任意位置,数据自动完成保存。添加数据:表格最下方为添加数据行,在其中输入数据即可添加一条新记录。注意:自动增量字段(如Django自动添加的id字段)不需要输入值。删除数据:单击每行左侧的选择按钮,选中该行。再用鼠标右键单击该行任意位置,在弹出的快捷菜单中选择“删除”命令,打开确认对话框。在对话框中单击“是”按钮删除选中的行。4.2.24.2.2添加数据添
14、加数据 添加数据的基本步骤:首先创建模型对象,再调用save()方法将对象数据写入数据库 E:chapter4python manage.py shell#进入当前项目的Python交互环境 from faqs.models import faqsdata#导入模型类 d=faqsdata(question=test,answer=bbb)#创建模型对象 d.save()#执行保存操作,将数据写入数据库 d.id,d.question,d.answer#查看字段值(1,test,bbb)create()方法可用于创建对象,同时执行保存操作示例如下。d=faqsdata.objects.crea
15、te(question=test3,answer=test3)#创建对象,并将数据存入数据库 d.id 4Django通过Manager(模型管理器)提供数据库访问接口。默认情况下,Django为每个模型添加一个名为objects的管理器,调用objects的各种方法可完成相关的数据库操作。在使用模型对象添加数据时,应注意默认的id字段。Django自动为模型添加一个名为id的自动增量字段,将其作为模型的主键。应注意的是,在创建了模型对象后,调用save()保存数据之前,id字段值是空值 示例代码如下。d4=faqsdata(question=test4,answer=test4)#创建对象
16、d4.id#查看id字段值,输出结果为空 d4.question test4 d4.save()#保存对象到数据库 d4.id#id字段有值 5在创建模型对象时,也可指定自动增量字段id的值,例如:d=faqsdata(id=5,question=test8,answer=aaa)注意,如果指定的id值与数据库表中已有的id值相同,则会用新数据覆盖原数据。4.2.34.2.3获取数据获取数据 Django通过模型对象的默认模型管理器objects提供了多种获取数据的方法。1 1获取所有数据行获取所有数据行 all()方法返回数据表中的所有数据。all()方法相当于SQL中的“SELECT*FR
17、OM”命令,示例代码如下。ds=faqsdata.objects.all()#获取全部数据行 for a in ds:#迭代,输出全部数据.print(a.id,a.question,a.answer).3 test bbb 4 test3 test3 5 test8 aaa 其中,faqsdata.objects.all()相当于“SELECT*FROM faqs_faqsdata”。2获取排序数据 order_by()方法返回按指定字段排序的结果 示例代码如下。ds=faqsdata.objects.order_by(answer)#返回按answer字段排序的数据 for a in ds
18、:.print(a.id,a.question,a.answer).5 test8 aaa 3 test bbb 4 test3 test3 其中,faqsdata.objects.order_by(answer)相当于“SELECT*FROM faqs_faqsdata ORDER BY answer”。3筛选数据filter()方法按指定条件筛选数据,示例代码如下。ds=faqsdata.objects.filter(question=test)for a in ds:.print(a.id,a.question,a.answer).3 test bbb其中,faqsdata.object
19、s.filter(question=test)相当于“SELECT*FROM faqs_faqsdata WHERE question=test”。exclude()方法与filter()方法相反,它返回不满足条件的数据 示例代码如下。ds=faqsdata.objects.exclude(question=test)for a in ds:.print(a.id,a.question,a.answer).4 test3 test3 5 test8 aaa 其中,faqsdata.objects.exclude(question=test)相当于“SELECT*FROM faqs_ faqsd
20、ata WHERE not question=test”。4获取单个数据行get()方法按条件搜索单个数据行,返回结果为模型对象示例代码如下。d=faqsdata.objects.get(id=3)print(d.id,d.question,d.answer)3 test bbb如果给定的条件匹配多个数据行,则会触发MultipleObjectsReturned异常。如果没有找到匹配的数据行,则会触发DoesNotExist异常。5values()和values_list()all()、order_by()、exclude()和filter()方法返回查询集对象(QuerySet),查询集对象
21、用于迭代时,其成员是模型对象。每个模型对象封装一条记录。values()方法返回的查询集在用于迭代时,其成员是字典对象,每个字典对象封装一条记录,示例代码如下。ds=faqsdata.objects.exclude(question=test)#返回查询集 ds#查看查询集成员类型 QuerySet,ds=faqsdata.objects.exclude(question=test).values()#返回封装字典对象的查询集 ds#查看查询集成员类型 可在values()方法的参数中指定查询结果集包含的字段 示例代码如下。faqsdata.objects.values()#不指定字段名时,包
22、含全部字段 faqsdata.objects.values(id,question)包含指定字段 values_list()和values()类似,它返回的查询结果集封装的是元组,每个元组对应一条记录 示例代码如下。faqsdata.objects.values_list(id,question)4.2.4字段查找 在filter()、exclude()和get()方法中,可使用Django提供的字段查找功能。字段查找表达式基本格式为“字段名_查找类型=表达式”,注意“字段名”和“查找类型”之间是两个下划线。例如:ds=faqsdata.objects.filter(id_in=3,5)#等同
23、于SQL中的where id in(3,5)for a in ds:.print(a.id,a.question,a.answer).3 test bbb 5 test8 aaa 其中,faqsdata.objects.filter(id_in=3,5)相当于“SELECT*FROM faqs_faqsdata WHERE id in(3,5)”。表4-3字段查找类型查找类型查找类型说明说明exact完全符合。例如,question_exact=test等同于where question=test。与None比较时,SQL会将其解释为NULL。例如,question_exact=None,等同
24、于where question is NULLiexact与exact类似,但不区分字母大小写contains包含,区分字母大小写。例如,question_contains=test等同于where question like%test%。(注意:不同数据库中的like关键字用法可能有所不同。)icontains包含,不区分字母大小写in在指定项中进行匹配。例如,id_in=3,5,等同于where id in(3,5)。表达式可以是列表、元组、字符串,也可以是filter()、exclude()和get()等方法返回的包含单个字段值的查询集(QuerySet)gt大于。例如,id_gt=3等
25、同于where id 3gte大于等于。例如,id_gte=3等同于where id=3lt小于。例如,id_lt=3,等同于where id 3lte小于等于。例如,id_lte=3等同于where id d=faqsdata.objects.get(id=3)#获得要修改的数据行 print(d.id,d.question,d.answer)#输出数据 3 test bbb d.question=如何更新数据#给属性赋值 d.save()#将更好后的数据存入数据库 print(d.id,d.question,d.answer)#输出更新后的数据 3 如何更新数据 bbb 可通过对筛选结果执
展开阅读全文