书签 分享 收藏 举报 版权申诉 / 110
上传文档赚钱

类型PythonWeb开发基础教程-第4章-模型和数据库课件.pptx

  • 上传人(卖家):三亚风情
  • 文档编号:3371762
  • 上传时间:2022-08-24
  • 格式:PPTX
  • 页数:110
  • 大小:302.04KB
  • 【下载声明】
    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 可通过对筛选结果执

    26、行update()方法来更新单个或多个数据行 示例代码如下。ds=faqsdata.objects.filter(id=3)#获得符合条件的数据行 ds.update(answer=对象赋值或update()方法)#更新查询集中所有对象的answer字段 1 update()方法命令返回更新后的数据行数量。调用模型的objects.update()方法可更新表中的全部数据行 示例代码如下。faqsdata.objects.update(question=Django常见问题)#更新表中的全部数据行 34.2.64.2.6删除数据删除数据 delete()方法用于删除数据行 示例代码如下。faq

    27、sdata.objects.get(id=3).delete()(1,faqs.faqsdata:1)delete()方法返回一个元组,元组的第1个值为已删除的对象个数(即删除的数据行数),元组的第2个值是一个字典,它包含了对象类型和删除的对象个数。例如,“faqs.faqsdata:1”表示删除了一个类型为faqs.faqsdata的对象。可用delete()方法删除表中的全部数据 示例代码如下。faqsdata.objects.all().delete()(3,faqs.faqsdata:3)4.2.7查询集操作1 1计算长度计算长度可使用len()和count()方法获取查询集长度,查询

    28、集长度是查询集从数据库返回的数据行数示例代码如下。ds=faqsdata.objects.all()ds.count()3 len(ds)3 2迭代操作 all()、order_by()、exclude()和filter()方法返回的查询集封装的是模型对象 values()方法返回的查询集封装的是字典对象 values_list()返回的查询集封装的是元组。不管查询集封装的是哪种类型的对象,均可执行迭代操作。可使用for in循环对查询集执行迭代操作,示例代码如下。ds=faqsdata.objects.all()for a in ds:#执行迭代.print(a.id,a.question)

    29、还可使用iterator()方法返回查询集的迭代器,然后使用next()方法执行迭代 示例代码如下。ds=faqsdata.objects.all()it=ds.iterator()#获取迭代器 while True:.try:.a=next(it)#用迭代方法获取对象.print(a.id,a.question).except StopIteration as e:.print(迭代结束)next()方法在迭代结束时,会触发StopIteration异常。3切片操作查询集支持切片操作,示例代码如下。ds=faqsdata.objects.all():2#返回前2条数据 for a in ds

    30、:.print(a.id,a.question,a.answer).3 test bbb 4 test3 test3 4布尔运算 查询集可作为逻辑值用于布尔运算,如用于bool()、if、and、or等。作为逻辑值使用时,查询集中不为空时,其值为True,否则为False 示例代码如下。ds=faqsdata.objects.filter(answer_contains=test)if ds:.print(存在包含test的answer字段).else:.print(不存在包含test的answer字段)在测试查询集是否包含查询结果时,用exists()方法的效率更高,示例代码如下。if ds

    31、.exists():.print(有符合条件的数据).else:.print(没有符合条件的数据)5&和|运算 查询集支持&(与)和|(或)运算。执行&或|运算时,两个查询集必须使用相同的模型,Django会将两个查询集的过滤条件合并,等价于SQL中的“where and”和“where or”。&运算 例如,下面的命令返回question和answer字段均包含“test”的数据行。ds=faqsdata.objects.filter(question_contains=test)&faqsdata.objects.filter(answer_contains=test)等价于:ds=faq

    32、sdata.objects.filter(question_contains=test,answer_contains=test)等价于SQL中的“SELECT*FROM faqs_faqsdata WHERE question like%test%and answer like%test%”。还可以使用Q对象来创建类似的&或|运算,示例代码如下。from django.db.models import Q ds=scores.objects.filter(Q(sx_gt=60)&Q(xm_startswith=李)等价于:ds=scores.objects.filter(sx_gt=60,x

    33、m_startswith=李)ds=scores.objects.filter(sx_gt=60)&scores.objects.filter(xm_startswith=李)|运算 例如,下面的命令返回yw或sx字段大于90的数据行。ds=scores.objects.filter(Q(sx_gt=90)|Q(yw_gt=90)等价于:ds=scores.objects.filter(sx_gt=90)|scores.objects.filter(yw_gt=90)4.3 索引索引是数据库表中对一列或多列的值进行排序的一种结构。默认情况下,Django为模型的主键和外键创建索引。通常,索引可

    34、以大大提高表的查询、更新和删除速度,但会降低表的插入速度本节主要内容 使用字段选项创建索引 在Meta子类中定义索引4.3.1使用字段选项创建索引 与索引有关的字段选项如下。db_index:为True时,为字段创建索引。primary_key:为True时,字段为模型的主键,为字段创建索引。unique:为True时,为字段创建唯一索引。unique_for_date、unique_for_month和unique_for_year等选项与unique类似。下面的代码使用字段选项为模型创建索引。#chapter4chapter4faqsmodels.py from django.db imp

    35、ort models class test1(models.Model):field1=models.CharField(max_length=200,db_index=True)#为字段创建普通索引 field2=models.CharField(max_length=200,unique=True)#为字段创建唯一索引4.3.2在Meta子类中定义索引 模型的Meta子类用于为模型定义描述相关属性的元数据。Meta类的indexes选项用于为模型定义索引。例如,下面的代码为模型创建索引。#chapter4chapter4faqsmodels.py from django.db import

    36、 models class test2(models.Model):field1=models.CharField(max_length=200)field2=models.CharField(max_length=200)class Meta:indexes=models.Index(fields=field1,name=idx_field1)#定义索引 参数fields设置用于创建索引的字段,参数name设置索引名称。如果需要创建基于多个字段的索引,可在参数fields中包含多个字段名称,例如,fields=field1,field2。在模型的Meta子类中,还可使用unique_toge

    37、ther属性创建组合唯一索引。组合唯一索引要求多个字段的组合值在表中唯一。为模型创建组合唯一索引的代码如下。#chapter4chapter4faqsmodels.py from django.db import models class test3(models.Model):field1=models.CharField(max_length=200)field2=models.CharField(max_length=200)class Meta:unique_together=(field1,field2)#创建组合唯一索引4.4 特殊查询表达式Django提供一些内置表达式来完成特殊

    38、操作,如F()表达式、数据库函数表达式、Subquery()表达式、Exists()子查询以及原始SQL表达式等。本节主要内容 准备实例数据 F()表达式 数据库函数表达式 Subquery()表达式 聚合函数 原始SQL表达式4.4.1准备实例数据首先需要在models.py文件中添加模型定义然后将模型迁移到数据库最后将scores.csv文件中的数据导入数据表。具体操作步骤:演示4.4.2F()表达式 F()表达式用于引用数据库中的字段值,并使用它们直接在数据库中完成操作,而不会将字段值从数据库读取到Python内存中。例如,要将faqs_scores表中kh为“10110103”的yw字

    39、段增加10,传统方法如下。from faqs.models import scores d=scores.objects.get(kh=10110103)d.yw=d.yw+10#获取yw字段值,加上10后赋值给字段 d.save()#将更改存入数据库 传统方法在增加字段值时,需要先将字段值从数据库读取到Python内存中,修改后再调用save()方法将更改后的数据写回数据库。使用F()表达式来完成数据修改的命令如下。from faqs.models import scores from django.db.models import F d=scores.objects.get(kh=101

    40、10103)d.yw=F(yw)+10#更新字段 d.save()#将更改存入数据库使用F()表达式修改数据后,要获得更新后的值,需要重新加载对象示例代码如下。d=scores.objects.get(kh=10110103)或者:d.refresh_from_db()F()表达式还可在过滤器中使用。例如,下面的命令获得yw和sx字段值相等的数据行。ds=scores.objects.filter(yw=F(sx)for a in ds:.print(a.id,a.kh,a.xm,a.yw,a.sx).12 10130528 向军 95 95 48 10330509 周子棚 70 70 59

    41、10351105 封舒宁 88 884.4.3数据库函数表达式在查询表达式中可使用数据库函数,如Left、Length、Right等示例代码如下。from django.db.models.functions import Left ds=scores.objects.annotate(first_name=Left(xm,1)ds0.first_name,ds0.xm(吴,吴忱)4.4.4Subquery()表达式 Subquery()表达式用于创建SQL子查询。例如,下面的代码输出yw字段中值排前3名的数据。from django.db.models import Avg,Subquery

    42、 ywavg=scores.objects.aggregate(Avg(yw)subq=scores.objects.filter(yw_gt=ywavgyw_avg).order_by(-yw)top3=scores.objects.filter(id_in=Subquery(subq.values(id):3)for a in top3:.print(a.xm,a.yw).张慧贤 118 向军 95 杜洋 1074.4.5聚合函数 聚合函数用于执行汇总计算,如计算最大值、最小值、平均值等。Django提供的聚合函数如下:Avg:求平均值。Count:求数量。Max:求最大值。Min:求平均

    43、值。StdDev:求标准差。Sum:求和。Variance:求差额。聚合函数通常作为aggregate()方法的查询表达式使用。例如,下面的命令返回yw字段的平均值、最大值和最小值。from faqs.models import scores from django.db.models import Avg,Max,Min scores.objects.aggregate(Avg(yw),Max(yw),Min(yw)yw_avg:48.693548387096776,yw_max:118,yw_min:0 默认情况下,返回的汇总值字段名为“汇总字段名_小写的聚合函数名”。可以在查询表达式中指

    44、定返回的字段名 示例代码如下。scores.objects.aggregate(ywavg=Avg(yw),ywmax=Max(yw),ywmin=Min(yw)ywavg:48.693548387096776,ywmax:118,ywmin:0 可结合使用values()和annotate()方法,实现分类汇总,即实现SQL中group by的功能。例如,按bj分类计算yw和sx字段平均值。ds=scores.objects.values(bj).annotate(Avg(yw),Avg(sx)for a in ds:.print(abj,ayw_avg,asx_avg).class1 48

    45、.0 78.29411764705883 class2 44.333333333333336 73.52380952380952 class3 52.166666666666664 70.20833333333333 在分类汇总时,应注意values()方法总是在annotate()方法之前。若values()方法放在annotate()方法之后,则返回包含指定列字典对象的查询集 示例代码如下。ds=scores.objects.annotate(Avg(yw),Avg(sx).values(bj)print(ds0,ds1,ds2)bj:class1 bj:class1 bj:class14

    46、.4.6原始SQL表达式 原始SQL表达式可完成一些比较复杂的查询。django.db.models.expressions模块中的RawSQL类用于构造原始SQL表达式。例如,下面的命令计算scores表中yw字段值不小于90的数量,并按yw字段值从高到低输出前4名学生的信息。from django.db.models.expressions import RawSQL ds=scores.objects.all().annotate(ywgt90=RawSQL(select count(*)from faqs_scores where yw=%s,(90,)for a in ds.orde

    47、r_by(-yw):4:.print(a.xm,a.yw,a.ywgt90).张慧贤 118 3 杜洋 107 3 向军 95 3 奉芸龙 89 34.5执行原始SQL查询Django提供了两种执行原始SQL查询的方法:用模型管理器的raw()方法执行原始SQL查询并返回模型实例 不使用模型直接执行原始SQL。建议使用模型完成数据库访问,直接使用原始SQL存在SQL注入风险。本节主要内容 用raw()方法执行原始SQL 直接执行原始SQL4.5.14.5.1用用raw()raw()方法执行原始方法执行原始SQLSQLraw()方法通常用于执行SQL中的select查询,该方法的返回结果是一个R

    48、awQuerySet对象实例。RawQuerySet对象可用于迭代、计算长度、索引等操作。1执行简单查询 from faqs.models import scores ds=scores.objects.raw(select*from faqs_scores where yw90 and sx90)ds#查看对象类型 90 and sx90 for a in ds:#迭代RawQuerySet.print(a.id,a.kh,a.yw,a.sx)#访问对象数据,此时从数据库检索数据.12 10130528 95 95 len(ds)#计算长度 1 print(ds0.id,ds0.xm)#索引

    49、RawQuerySet 12 向军 raw()方法执行SQL命令时,会延迟执行数据库操作,只有在访问对象数据时,才会从数据库检索数据。2 2为查询提供参数为查询提供参数 可通过raw()方法的第2个参数为查询提供参数 示例代码如下。ds=scores.objects.raw(select*from faqs_scores where kh=%s,10110103)print(ds0.id,ds0.xm)1 吴忱 在raw()方法的SQL查询字符串中,用%s作为参数占位符,对应的参数应放在列表中。当参数是字符串时,不需要在查询字符串中为参数占位符添加引号,Django会自动处理参数中的字符串。3

    50、添加计算字段 可以在SQL查询字符串中使用表达式添加计算字段,模型对象会将计算字段作为注释字段处理。例如,下面的命令返回yw和sx字段值的和。ds=scores.objects.raw(select id,yw,sx,yw+sx as total from faqs_scores limit 3)for a in ds:.print(a.id,a.xm,a.yw,a.sx,a.total).1 吴忱 85 76 161 2 杨九莲 33 99 132 3 安芸芸 39 84 123 注意,尽管在查询字符串中指定了输出字段,但raw()方法仍然会从数据库返回模型的所有字段,查询结果中出现的模型未

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:PythonWeb开发基础教程-第4章-模型和数据库课件.pptx
    链接地址:https://www.163wenku.com/p-3371762.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库