收藏 分销(赏)

PythonWeb开发基础教程 第4章 模型和数据库.pdf

上传人:曲**** 文档编号:225458 上传时间:2023-03-08 格式:PDF 页数:110 大小:2.71MB
下载 相关 举报
PythonWeb开发基础教程 第4章 模型和数据库.pdf_第1页
第1页 / 共110页
PythonWeb开发基础教程 第4章 模型和数据库.pdf_第2页
第2页 / 共110页
PythonWeb开发基础教程 第4章 模型和数据库.pdf_第3页
第3页 / 共110页
PythonWeb开发基础教程 第4章 模型和数据库.pdf_第4页
第4页 / 共110页
PythonWeb开发基础教程 第4章 模型和数据库.pdf_第5页
第5页 / 共110页
点击查看更多>>
资源描述

1、Python Web开发基础教程(Django版)第4章模型和数据库本章主要内容:模型基用数据操作索引特殊查询表达式 执行原始SQL查询 关系4.1模型基础 模型是项目的数据来源。每个模型都是一个Python类,并且映射到一个数据库表。模型的每个属性相当于数据库表的一个字段。使用模型对象可完成各种数据库表操作。本节主要内容 定义模型 模型配置 迁移数据库 定义字段4.1.1定义模型,定义模型就是实现一个django.db.models.Model类的子 类。模型的文件名称默认为models.py,也可使用其他名称。实例:创建项目chapteM和应用fa qs,在应用faqs中定义模型类 faq

2、sdatao具体操作步骤:演示4.1.2模型配置要使用模型,还需要在项目配置文件settings.py中完成相应的设置。直先,需要在项目配置文件的INSTALLED_APPS变量中添加包含模型的应用名 I,代码如下。INSTALLED_APPS=,Ta qs,其必 需要在|目配置文件的DATABASES变量中设置数据库信息,项目默认 的数据库诩直信息如下 DATABASES=default1:,ENGINE1:django.db.backends.sqliteS,NAME1:os.path.join(BASE_DIR,db.sqliteS),MySQL数据库的配置如下。DATABASES=de

3、fault1:ENGINE1:django.db.backends.mysql1,NAME:mysqldb1,USER1:sqldbuserl,PASSWORD:sqldbpasswordl,-HOST:,-PORT1:,Oracle数据库的配置如下。DATABASES=default1:ENGINE:django.db.backends.oracle1,NAME1:myordb1,USER1:ordbuserl,PASSWORD:ordbpasswordl,HOST1:1127.0.0.11,-PORT1:115401,PostgreSQL数据库的配置如下。DATABASES=default

4、1:ENGINE:django.db.backends.postgresql1,NAME1:mypsdb,-USER1:psdbuserl,PASSWORD:psdbpasswordal,Hosr/y,o.o,i1,PORT1:5432:4.1.3近移数据库再质覆患电定义和配置后,在使用数据库之前,还需执行数据 库北移操作O髀%i|僵睛辘%型的更改(模型定义、模型删除、字首先,执行makemigrations命令,根据模型的更改情况生成迁移 文件。E:chapter4python manage.py makemigrations超ii移文件后,执行migrate命令,应用正移文件完成日移操 E

5、:chapter4python manage.py migrate4.1.4定义字段字段的定义包括字段名、字段类型和字段选项1示例代码如下。question=models.CharField(max_length=200Jblank=True),其中,question为字段名,CharField为字段类型,ma xjengthffi blank为字段选项。Django在django.db.models.fields模块中定义了可用的字段类型。为了方便,Django E断ields模块导入到django.db.models模块巾。,通常,先用from django.db import model

6、s 导入models模块,然后 用models.xxxField来引用字段类型。表4-1字段类型AutoFieldBigAutoField BiglntegerField BinaryField BooleanFieldCharFieldDateFieldDateTimeField自动增量,32位整数,取值范围是2凡工自动增量,64位整数,取值范围是”263一工64位整数,取值范围是-263263一工。字段的默认表单控件为Textinput存储原始二进制数据存储True或False。字段的默认表单控件为Checkboxinput存储字符串。字段的默认表单控件为Textinput存储日期,字段值

7、为datetime.date实例。字段的默认表单控件为Textinput存储日期时间,字段值为datetime.datetime实例。字段的默认表单控件为TextinputDecimalFieldDurationField存储固定精度的十进制数字段,字段值为Decimal实例。字段的默认表单控件为Numberinput存储时间段EmailFieldFileFieldFilePathFieldFloatFieldImageField存储E-mail地址存储文件。字段的默认表单控件为ClearableFilelnput 存储文件路径存储浮点数字。字段的默认表单控件为Numberinput 存储图片

8、段的默认表单控件为ClearableFileSput表4-1字段类型(续)字段类型IntegerFieldGenericl PAddressFieldPositivelntegerFieldPositiveSmalllntegerFieldSlugFieldSmalllntegerFieldTextFieldTimeFieldURLFieldUUlDField说明存储整数。取值范围是字段的默认表单控件为Numberinput 存储字符串格式的IPv4或IPv6地址。字段的默认表单控件为Textinput 存储非负整数。取值范围是。23】女存储非负小整数。取值范围是。2况:1存储Slug数据,只

9、包含字母、数字、下划线或连字符 存储小整数。取值范围是存储大量文本。字段的默认表单控件为Textarea存储口寸间,字段值为datetime.time实例。字段的默认表单控件为Textinput存储URL。字段的默认表单控件为Textinput存储唯一标识符,字段值为UUID类实例表4-2字段选项选项说明nullblankchoicesdb column db_index db tablespace default editableerror_messages help_text primary_key unique unique_for_date unique_for_month uniqu

10、e for year verbose name validators默认为False。为True时,Django在字段无数据时将空值NULL存入数据库(字符串字段存入空字符串)默认为False。为True时,字段允许为空,即表单验证将允许输入空值。blank影响数据验证,null影响数据 库数据存储为字段定义选择项。字段值为选择项中的列表或元组中的值定义字段在数据库表中的列名称。未设置时,Django用模型中的字段名作为数据库表列名称为True时,为该字段创建数据库索引若为字段创建了索引,则为字段索引设置数据库的表空间名称默认是True。为False时,字段不在模型表单中显示设置字段的帮助信息

11、 _设置为True时,字段成为模型的主键。设置为True时,字段值在整个表中必须是唯一的设置为日期或日期时间字段名,关联的两个字段值在整个表中必须是唯一的类似unique_for_date。与关联的月份唯一类似unique_for_date。与关联的年份唯一为字段设置备注名称为字段设置校验器4.2数据操作后苜八 作包工 操,化 视 ffsw 库使 数和我也 义步。定一据 型模可除 完,和 61髓鼾腺数据二更贸数库中直了与模型一致的“口徽据、I取摄1a更厥1(如Visual Studio)来管理身患O,本节主要内容在Visual Studio 中管 USQLite数据库,潦加数据 获取数据 字段

12、查找 更新数据 删除数据查询集操作4.2.1 在Visual Studio 中管理 SQLite 数据库,使用第三方 1 ftdotConnectforSQLite,可在Visual Studio中管理SQLite数据库。1.安装件 dotConnect for SQLite-2.连接到SQLite数据库-Visual Studio使用服务器资源管理器管理服务器和数 据连接。-3.枪索数据 10018II0据的表(如faqs_faqsdata),然后选择“枪索数据”命 窗口查询设计器窗口默认显示了表的数据,可在其中修改、添加或删除数据。修改后按Enter键或单击当前行 II安思:白动鸡.在其A

13、1O可撅力仁条新记录。4)不需要输入。任话 HUM 督在 击。键话 feu 用开 再打O,行令 垓命 中”选陈 聊 钮“O 的 方4如干,一 m s接 击出”单曾7E:在“据,击 数置单 除位中 HH4.2.2潦加教据添加数据的基本步骤:首先创建模型对象,再调用save。方法符对象数据写入数据库 E:chapter4python manage.py shell#进入当前项目的 Python交互环境 from faqs.models import faqsdata#导入模型类 d=faqsdata(question=,test,answer=,bbb,)#fil建模型对象-d.saveO#执行保

14、存操作,招数据写入数据库 d.id,d.question,d.answer#查看字段值(1,test,bbb)-createO方法可用于创建对象,同时执行保存操作,示例如下。d=faqsdata.objects.create(question=test3,answer=,test3,)#创建对象,并将数据存入数据库 d.id,4Django通过Manager(模型管理器)提供数据库访问接口。默认情况下,Django为每个模型添加一个名为objects的管 理器,调用objects的各种方法可完成相关的数据库操作。在使用模型对象添加数据时,应注意默认的id字段。Django自研为模型添加一个名为

15、id的自研增量字段,将其作为模型的主鲤。应注意的是,在创建了模型对象后,调用save。保存数据之前,id字段值是空值 示例代码如下。d4=faqsdata(question=,test4Janswer=ltest4l)#创建对象-d4,id#查看id字段值,输出结果为空 d4.question test4-d4.save()#保存对象到数据库-d4.id#id字段有值,5在创建模型对象时,也可指定自动增量字段id的值,例虬 d=faqsdata(id=l5l,question=,test8lJanswer=laaal)注意,如果指定的id值与数据库表中已有的id值相同,则会用新数据覆盖原数据。

16、4.2.3获取教据Django通过模型对象的默认模型管理器objects提供了多种获取数据的方法。-1.获取所有数据行all()方法迟崂卷据表中附所J数据。all()方法相当于SQL中的“SELECT*FR0M”命令,示由代码如下。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*FROMfaqsjaqsdata”o-2.获取排

17、序数据 order_by()方法返回按指定字段排序的结果 示例代码如下。ds4aqsdata.objects.order.byCanswer1)#返回按answer 字段排序的数据 for a in ds:.print(a.idJa.questionJa.answer)-5 test8 aaa 3 test bbb-4 test3 test3其中,faqsdata.objects.order_by(lanswerl)tl 当于“SELECT*FROM faqsjaqsdata ORDER BY answer55 o3.筛选数据 filter。方法按指定条件筛选数据,示例代码如下。ds=faqs

18、data.objects.filter(question=,test,)for a in ds:.print(aJd,a.question,a.answer)3 test bbb 其中,faqsdata.objects.filter(question=ltestl)t0 当于“SELECT*FROM faqsjaqsdata WHERE questionJtest”“。-excludeO方法与filter()方法相反,它返回不满足条件的数据 示例代码如下。ds=faqsdata.objects.exclude(question=,test,)for a in ds:.print(a.id,a.

19、question,a.answer)4 test3 test3 5 test8 aaa其中,faqsdata.objects.exclude(question=test)ffl 当于“SELECT*FROM faqs_ faqsdata WHERE not question=,testH,5。-4.获取单个数据行 get()方法按条件搜索单个数据行,返回结果为模型对象 示例代码如下。d=faqsdata.objects.get(id=3)print(d.id,d.question,d.answer)3 test bbb如果给定的条件也配多个奥据行,则会触发 MultipleObjectsRet

20、urned#常。如果没有找到匹配的数据行,则会触发DoesNotExist异常。-5.values。和valuesist()-all()x order_by()s exclude。和filter。方法返回查询集对象(QuerySet),查询集对象用于迭代时,其成员是模型对象。每个模型对象封装一条记录。values。方法返回的查询集在用于迭代时,其成员是字典对象,每个字典对象封装一条记录,示 例代码如下。ds=faqsdata.objects.exclude(question=test)#返回查询集 ds#查看查询集成员类型 QuerySet,ds=faqsdata.objects.exclud

21、e(question=test).values()#j 回封装字典对象的查询集,ds#查看查询集成员类型 可在values。方法的参数中指定查询结果集包含的字段示例代码如下。faqsdata.objects.values()#不指定字段名时,包含全部字段 faqsdata.objects.valuesCid,question)包含指定字段 valuesist()和values。类似,它返回的查询结果集封装的是元组,每个元组对应一条 记录示例代码如下。faqsdata.objects.valuesJistCid,question)4.2.4字段查找在fUter()、exclude。和get()方

22、法中,可使用Django提供的字段查找功能。字段查找表达式基本格式为“字科名查找类型二表达式”,注意“字段名”和“查找类型”之间是两个下划瓢 例如:ds=faqsdata.objects.filter(id_in=3,5)#等同于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.川ter(id_in=3,5)相当于SELECT*FROM faqsjaqsdata WHERE id in(3,5)”。表4-3字段查找类型查找类型e

23、xactiexactcontainsicontainsingt gte ItIte说明完全符合。例如,question_exact=test等同于where question=test,o 与None比较时,SQL会将 其解释为NULL。例如,question_exact二None,等同于where question is NULL与exact类似,但不区分字母大小写包含,区分字母大小写。例如,question_contains=test等同于where question like%test%o(注意:不同数据库中的like关键字用法可能有所不同。)包含,不区分字母大小写在指定项中进行匹配。例

24、如,idin=b,5,等同于where id in(3,5)。表达式可以是列表、元组、字 符串,也可以是filter。、exclude。和get。等方法返回的包含单个字段值的查询集(QuerySet)大于。例如,id_gt=3等同于where id 3大于等于。例如,idgte=3等同于where id=3小于。例如,idlt=3,等同于where id 3小于等于。例如,idlte=3等同于where id d=faqsdata.objects.get(id=3)#获得要修改的数据行 print(d.id,d.question,d.answer)#输出数据 3 test bbb-d.ques

25、tion1如何更新数据”d.saveO print(d.id,d.question,d.answer)3如何更新数据bbb#给属性崛值#招更好后的数据存入数据库#输出更新后的数据可通过对筛选结果执行update。方法来更新单个或多个数据行示例代码如下。ds=faqsdata.objects.filter(id=,l3)#获得符合条件的数据行 ds.update(answe二”对象赋值或update。方法。#更新查询集中所有对象的 answer字段-1 update。方法命令返回更新后的数据行数量。,调用模型的objects.update()方法可更新表中的全部数据行示例代码如下。faqsdat

26、a.objects.update(question=Django问题。#更新表中的全部数据行-34.2.6m除教据 delete。法用于删除数据行示例代码如下。faqsdata.objects.get(id=3).delete()(1,faqs.faqsdata:1)delete。方法返回一个元组,元组的第1个值为已删除的对象个数(即删除的数据行数),元组 日第2个值是一个字典,它包含了对象类型和删除的对象个数。例虬 faqsdata.objects.all().delete()(3,faqs.faqsdata:3)4.2.7查询集操作1 计算长度.嚼眠小辎罂豳稀黯蒙长度,查询集长度示例代码如

27、下。ds=faqsdata.objects.all()ds.count()-3 len(ds)-32,迭代操作-all()s order_by()s exclude。和filter。方法返回的查询集封装的是模型 对象values。方法返回的查词集封装的是字典对象,va luesjist()l回的查询集封装的是元组。,不管查询集药装的是哪种类型的对象,均可执行迭代操作。,可使用forin循环对查询集执行迭代操作,示例代码如下。ds=faqsdata.objects.all()fora in ds:#执行迭代.print(a.id,a-question)通可佞用iterator。方法返回查阑集的迭

28、代器,然后使用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。方法在迭代结束时,会触发Stop依ration异常。-3.切片操作查彻集支持切片操作,示例代码如下。ds=faqsdata.objects.all():2 据 for a in ds:.print(a.id,a.question,a.answer)

29、#返回前2条数 3 test bbb-4 test3 test34.布尔运算查询集可作为遗辑值用于布尔运算,如用于bool()、if、and、or等。作为遗辑值使用时,查询集中不为空时,其值为True,否则为False,示例代码如下。ds=faqsdata.objects.filter(answer_contains=,test)if ds:print(存在包含4test5的answer字段。else:print。不存在包含test的answer字段。在测试查询集是否包含查词结果时,用exists。方法的 效率更高,示例代码如下。if ds.exists():prints有符合条件的数据),.

30、else:,print(啜有符合条件的数据。-5.&和I运算 查询集支持&(与)和I(黑)后算。执任&或喳号时,两个查询集必须使用相同的模 型,Django会将两个查询篥的在滤条件善并,第布手SQL中的“whereand”和“whereor”。&运算,例如,下面的命令返回question和answer字段均包含“test”的数据行。ds=faqsdata.objects.filter(question_contains=l,test)&faqsdata.objects.filter(answer_contains=test)等价于:ds=faqsdata.objects.filter(ques

31、tion_contains=test,answer_contains=test)等价于SQL 中的“SELECT*FROM faqsjaqsdata WHERE question like%test%and answer like,%test%ll o,还可以使用Q对象来创建类似的&或I运算,示例代码如下。from django.db.models import Q ds=scores.objects.filter(Q(sx_gt=60)&Q(xmstartswitlW 李)等价于:ds=scores.objects.filter(sx_gt=60,xm_startswith=,$)ds=sc

32、ores.objects.filter(sx_gt=60)&scores.objects.filter(xm_startswith=,$)I运算例虬 下面的命令返回yw或sx字段大于90的数据行。ds=scores.objects.filter(Q(sx_gt=90)|Q(yw_gt=90)等价于:ds=scores.obiects.filter(sx_gt=90)I scores.obiects.filterfyw_gt=90)4.3索引 索引是数据库表中对一列或多列的值进行排序的一种结 构。默认情况T,Django为模型的主键和外镀创建索引。通常,索引可以大大提高表的查彻、更新和删除速度,

33、但会降低表的插入速度 本节主要内容使用字段选项创建索引在Meta子类中定义索引4.3.1使用字段选项创建索引与索引有关的字段选项如下。-dbjndex:为True时,为字段创建索引。-primary.key:为True时,字段为模型的主键,为字段创建索弓I。unique:为True%为字段创建唯一索弓I。unique_for_dates unique_for_monthfll unique_for_yearf 选双 与 unique类似。下面的代码使用字段选项为模型创建索弓I。#chapter4chapter4faqsmodels.py from django.db import models

34、class testl(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选项用于为 模型定义索弓I。例如,下面的代码为模型创建索弓I。#chapter4chapter4faqsmodels.py from django.db import models c

35、lass test2(models.Model):fieldl=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=fied1field21。,在模型的Meta子类中,业可使用unicLue_togethe蜃性创建组合

36、唯一索 弓I。组合唯一索引要求组个字段的制台值在表卡唯一。,为模型创建组合唯一索引的代码如下。#chapter4chapter4faqsmodels.py from django.db import modelsclass test3(models.Model):field1=models.CharField(maxJength=200)field2=models.CharField(max_length=200)class Meta:unique_together=(field1-field2)#创建组合唯一索引4.4特殊查询表达式斗n空瞿小二空艮置表达式来完成特曾操作,如F()表达 或、机

37、患用函檄莹达在、Subquery()表达式、Exists。子查 询以及原用SQL表达式等。本节主要内容,准备实例数据F()表达式,数据库国数表达式Subquery()表达式,聚合函数,原始SQL表达式4.4.1准备实例数据首先需要在models.pv文件中添加模型定义,然后招模型迁移到数据库最后将scores.csv文件中的数据导入数据表。具体操作步骤:演示4.4.2 F()表达式中 库据-O 在中 接存 1内 Hho 用pyt 使到 并取,读 值库 段据 的从 据字 用会 引不 于而 用,式作 表成=()完号耳法卡aqs_scores表中kh为M0110103的,w字段增加10,from f

38、aqs.models import scores d=scores.objects.get(kh=d.yw=d.yw+10#获取yw字段值,加上10后赋值给字段 d.saveO#将更改存入数据库传传统,使用F()表达式来完成数据修改的命令如下。from faqs.models import scores from django.db.models import F d=scores.objects.get(kh=101101031)1 d.yw=F(yw!)+10#更新字段 d.saveO#招更改存入数据库使用F()表达式修改数据后,要获得更新后的值,需要 重新加载对象,示例代码如下。d=sc

39、ores.objects.get(kh=101101031)或者:d.refreshjrom_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)72 10130528 向军 95 9548 10330509 周子棚 70 70-59 10351105 封舒宁 88 884.4.3 数据库函数表达式,在查询表达式中可使用数据库函数,如Left、Length、Rightf,示例代码如下。from djan

40、go.db.models.functions import Left ds=scores.objects.annota te(first_name=Left(lxm,1)dsO.firsLna me,dsO.xm(i吴吴慌)4.4.4 SubqueryO表达式,SubqueryO表达式用于创建SQL子查询。例如,下面的代码输出yw字段中值排前3名的数据。from django.db.models import Avg,Subquery ywavg=scores.objects.aggregate(Avg(yw)subq=scores.objects.filter(yw_gt=ywavgyw_a

41、vgJJ.order-byC-yw1)top3=scores.objects.filter(id_in=Subquery(subq.values(,id):3)for a in top3:print(a.xm,a.yw)81 7 I 154贝951 o 慧军洋-张向杜4.4.5聚合函数革合函数用于执行汇总计算,如计算最大值、最小值、平均值,Dja ngo提供的聚合函数如下:Avg:求平均值。Count:求数量。Max:求最大值。Min:求平均值。StdDev:求标准差。Sum:求疝。Variance:求差额。聚合函数通常作为aggregate。方法的查询表达式使用。普虬下面的命令返回yw字段的

42、平均值、最大值和最小 from faqs.models import scores from django.db.models import Avg,Max,Min scores.objects.aggregate(Avg(W),Max(llywll),Min(llyw11)yw_avg:48,693548387096776,yw_max:118,yw_min1:0默认情况下,返回的汇总值字段名为“汇总字段名小写的聚合 函数名”。可以在查询表达式中指定返回的字段名示例代码如下。scores.objects.aggregate(ywavg=Avg(,lyw,),ywmax=Max(,yw,)Jy

43、wmin=Min(,yw)ywavg1:48.693548387096776,ywmax1:118,ywmin1:0可结合使用values。和annotate。方法,实现分类汇总,即实现SQL中group by的弱能。例如,按bj分类计算yw和sx字段平均值。ds=scores.objects.values(,lbj,l).annotate(Avg(,lyw,l),Avg(,lsx,1)fora in ds:print(a,bjl,a,lyw_avg,l,a,sx_avg)Classi 48.0 78.29411764705883 class2 44,333333333333336 73.52

44、380952380952 class3 52.166666666666664 70.20833333333333,在分类汇总时,应注意values。方法总是在annotate。方法之前。若values。方法放在annotate。方法之后,则返回包含指定列字典 对象的查询集 示例代码如下。ds=scores.objects.annotate(Avg(l,yw,l)JAvg(l,sxl,).values(llbj)print(ds0,ds1,ds2)bj:classl1)bj:classl cla ssl14.4.6原始SQL表达式 原始SQL表达式可完成一些比我复杂的查询。django.db.m

45、odels,expressions模 块中的RawSQL类用于构if原好SQL表达宁。初虬 下面的命令计算scores表中yw字段值不小于90的数量,并按yw字段值 北高到低输出前4名学生的信息。from django.db.models.expressions import RawSQL ds=scores.objects.all().annotate(ywgt90=RawSQL(,lselect count(*)from faqs_scores where yw=%s,(90,)for a in ds.order_by(-yw):4:print(a.xm,a.yw,a.ywgt90)张慧贤

46、1183 杜洋107 3向军95 3奉芸龙89 34.5执行原始SQL查询-Django提供了两种执行原始SQL查询的方法:用模型管理器的raw()方法执行原始SQL查询并返回模型实例不使用模型直接执行原始SQL。建议使用模型完成数据库访I叽直接使用原始SQL存 在SQL注入风腌。本节主要内容用raw()方法执行原始SQL直接执行原始SQL4.5.1用ra w()方茯执行原始SQL-raw()方法通常用于执行SQL中的select查询,该方法的 返回结果是一个RawQuerySet对象实例。RawQuerySet 对象可用于迭代、计算长度、索引等操作。1.执行简单查询 from faqs.mo

47、dels import scores ds=scores.objects.raw(select*from faqs_scores where yw90 and sx90),ds#查看对象类型 90 and sx90 fora in ds:#迭代RawQuerySet.prinUa.id.a.kh.a.yw.a.sx)#访问对象数据,此时从数据库检索数据 12 10130528 95 95 len(ds)#计算长度-1 print(dsO.id,dsO.xm)#索引 RawQuerySet-12向军 aw()方法执行SQL命令时,会延迟执行数据库操作,只有在访问对象数据时,才会从数据库检索教据。

48、2.为查询提供参数 可通过raw()方法的第2个参数为查询提供参数 示例代码如下。ds=scores.objects.raw(select*from faqs_scores where kh=%s,1101101031)print(dsO.id,dsO.xm)-1吴忧 车曾岷)方法的SQL查询字符串中,用$作为参数占位符,对应的参数应放在 或表中。/爵|翼髀建嚼在查询字符串中为参数占位符添加引号an。3,添加计算字段,可以在SQL查询字符串中使用表达式添加计算字段,模型对象会招 计算字段作物注释字段处理。,例如,下面的命令返Elyw和sx字段值的和。ds=scores.objects.raw(

49、select id,yw,sx,yw+sx as total from faqs_scores limit 3)for a in ds:.print(a.id,a.xmJa.ywJa.sx,a.total)1吴忧85 76 161 2杨九莲33 99 132 3安芸芸39 84 123符有,字查型段 在1字 尽返注,库为 注欣于annotate。O段4.执行 inserts update和delete等 SQL命令-raw()方法也可以执行SQL中的insert、update和delete命令示例代码如下。from faqs.models import faqsdata d=faqsdata.

50、objects.raw(update faqsjaqsdata set answer=%s where id=3,lraw 改)d.query,_execute_query()#立即执行查询命令 d=faqsdata.objects.raw(insert into faqs_faqsdata(question,answer)valuesC 测试 1 7测试 1 答案 1)d.query._execute_query()d=faqsdata.objects.raw(delete from faqsjaqsdata where id=6)n=d.query._execute_query()调用ra

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 环境建筑 > 图纸/模型

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服