![reboot自动化班课件-第三天模型_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-11/5/7e4c6f44-35e0-40b5-9b4e-9b5833c250a9/7e4c6f44-35e0-40b5-9b4e-9b5833c250a91.gif)
![reboot自动化班课件-第三天模型_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-11/5/7e4c6f44-35e0-40b5-9b4e-9b5833c250a9/7e4c6f44-35e0-40b5-9b4e-9b5833c250a92.gif)
![reboot自动化班课件-第三天模型_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-11/5/7e4c6f44-35e0-40b5-9b4e-9b5833c250a9/7e4c6f44-35e0-40b5-9b4e-9b5833c250a93.gif)
![reboot自动化班课件-第三天模型_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-11/5/7e4c6f44-35e0-40b5-9b4e-9b5833c250a9/7e4c6f44-35e0-40b5-9b4e-9b5833c250a94.gif)
![reboot自动化班课件-第三天模型_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-11/5/7e4c6f44-35e0-40b5-9b4e-9b5833c250a9/7e4c6f44-35e0-40b5-9b4e-9b5833c250a95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Rock第三天:django模型3 June 2018Reboot自动化班课件 删除对象新对象查询对象创建对象模型迁移meta选项字段选项模型字段模型大纲 模型是你的数据唯一的、权威的信息源。它包含你所储存数据的必要字段和为。每个模型对 应数据库中唯一的一张表。 么是模型 字段:每个字段通过Field类的一个实表示 如字符字段CharField和日期字段 式。你将在Python代码中使用到它的值,并且你的数据库将把它用作表的名 字段名:每个Field 实的名字(如username)就是字段的名字,并且是机可读的格 DateTimeField。这种方法告诉Django,每个字段中保存着么类型的数
2、据模型:每个模型都用一个类表示,该类继承自django.db.models.Model。每个模型有多个类的属性变,而每一个类的属性变又都代表数据库表中的一个字段 如何编写模型 CharFieldBooleanFieldIntegerFieldDateField / DateTimeFieldEmailFieldTextFieldTimeFieldeld-types(/en/1.11/ref/models/ elds/# eld-types)模型字段 ,() 无论是显式声明还是自动添加 每个模型只能有一个字段指定primary_key=T
3、rue就会自动添加id 如果Django看到你显式地设置Field.primary_keyid = models.AutoField(primary_key=True)默认情况下Django会给每个模型添加下面这个字段 自增主键字段 每个字段类型都接受一个可选的位置参数字段的自述名,如果没有给定自述名, Django将根据字段的属性名称自动创建自述名将属性名称的下划线替换成空格 ForeignKey、 自述名me#如:自述名为:first namefirst_name = models.CharField(max_length=30)#如:自述名为:persons first nafirst_
4、name = models.CharField(persons first name, max_length=30)ManyToManyField 和 OneToOneField 这三个可以使用verbose_name指定 字段的自述名 (-null-blank-choices-default- primary_key- uniqueeld-options(/en/1.11/ref/models/ elds/# eld-options)VARCHAR 数据库字段的大小和它的派生类)需要max_length 参数来指定 CharField
5、每个字段有一些特有的参数,如,字段选项 如果为True,:False默认值 Django将用NULL来在数据库中存储空值字段选项null :blank=False,该字段就是必须的 blank=True,表单验证允许该字段为空null是纯数据库范畴,而blank是数据验证范畴的 False默认值 如果为True , 该字段允许填字段选项blank 由二元组组成的一个可迭代对象(如表或元组),用来给字段提供选择项,如果设置 choices字段选项choices(FR, Freshman),(SO, Sophomore),(JR, Junior),(SR, Senior),)YEAR_IN_SCH
6、OOL_CHOICES = (, 默认的表单将是一个选择框,选择框的选择就是choices中的选项 字段的默认值,可以是一个值或者调用对象 字段选项default 如果为True,那么这个字段就是模型的主键字段选项primary_key 如果该值设置为True,这个字段的值在整张表中必须是唯一的 字段选项unique :模型元数据是 “任何是字段的数据”,比如排序选项(ord ering),数据库表名 (db_table)。在模型中添加class Meta是完全可选的,所有选项都是必须的。 from django.db import modelsclass User(models.Model)
7、:username = models.IntegerField()class Meta:ordering = username使用内部的class Meta 定义模型的元数据,如 模型meta选项 /en/1.11/ref/models/options/orderingdb_tablemeta选项表 据库表名称,由这个模型的“应用名”和模型类名称之间加上下划线组成。 。 Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。一个模型的数 db_table是用于指定自定义数据库表名的。Django有一套默认的按照一定规
8、则生成数据模 型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性指定 meta选项: db_table当你通过db_table覆写表名称时,强推荐使用小写字母给表命名使用Meta类中的db_table 参数来重写数据表的名称db_table = serverclass Meta:若提供该参数, Django会使用app_label + _ + module_name作为表的名字 它是一个字符的表或元组。每个字符是一个字段名,前面带有可选的“-”前缀表示倒 按订单升序排ordering=order_date ordering=-order_dateordering=?order_dat
9、e# #按订单降序排,-表示降序 随机排序,?表示随机对ordering = -pub_date, author#pub_date降序, 然后对author这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的 meta选项:order升序序 前面没有“-”的字段表示正序。使用?来表示随机排序。 ordering = -order_dateclass Meta: app_label这个选项只在一种情况下使用,就是你的模型类在默认的应用程序包下的meta选项: app_labelapp_label=myappclass Meta:models.py文件中,这时候你需要指定你这个模
10、型类是那个应用程序的 一个DateField 或DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个get_latest()最函数以得到新的对象(依据那个字段):meta选项: get_latest_byget_latest_by = order_dateclass Meta:个字段进选取的。由于Django的管方法中有个l astest()方法,就是得到最近一记录。如果你的数据模型中有DateField或DateTimeFie ld 类型的字段,你可以通过这个选项来指定lastest()是按照哪 :meta选项: verbose_nameverbose_name = p
11、izzaclass Meta:verbose_name的意思很简单,就是给你的模型类起一个可读的名字 managed的值设置为False。 。 图等,其他操作是一样的如果为False的时候,会对数据库表进创建、删除等操作。可以用于现有表、数据库视 等操作 在这个时间Django将管数据库中表的生命周期 。 默认值为True,这个选项为True时Django可以对数据库表进migrate或migrations、删除 由于Djan go会自动根据模型类生成映射的数据库表,如果你希望Django这么做,可以把 meta选项:managed 编写IDC模型 迁移是Django用于同步你的发生改变的模型
12、 (添加一个字段,删除一个模型,等等)到你的数据库数据库迁移 。 sqlmigrate, 展示迁移的sql语移, 以及撤销和出迁移的状态migrate, 负责执迁makemigrations, 负责基于你的模型修改创建一个新的迁移 迁移命令 会扫描和比较你当前迁移文件面的版本,同时新的迁移文件会被创建 python manage.py makemigrations dashboard生成迁移文件 展示迁移的sql语python manage.py sqlmigrate dashboard 0007 python manage.py migrate dashboard数据迁移 也可以使用一条语创
13、建并保存一个对象,使用create()方法 使用关键字参数实化模型实来创建一个对象,然后调用save() 把它保存到数据库中。 Django 使用一种直观的方式把数据库表中的数据表示成Python 对象:一个模型类代表数 据库中的一个表,一个模型类的实代表这个数据库表中的一条特定的记录。 创建对象 。 中所有User 对象的一个查询集。er.objects.all() 返回包含数据库 对于一个模型来说,管是查询集的主要来源。如,Us级别”的操作和“记录级别”的操作管只可以通过模型的类访问,而可以通过模型的实访问,目的是为强制区分“表 你可以从模型的管那取得查询集。每个模型都至少有一个管,它默认
14、命名为 objects。通过模型类来直接访问它, 查询集(queryset)表示从数据库中取出来的对象的集合。它可以含有零个、一个或者多个过滤 过滤基于所给的参数限制查询的结果。 从SQL 的角度,查询集和SELECT 语等。 价,过滤是像WHERE和LIMIT一样的限制子。 通过模型中的管构造一个查询集,来从你的数据库中获取对象查询对象 :all_users = User.objects.all()all()方法返回包含数据库中所有对象的一个查询集获取一个表中所有对象的最简单的方式是全部获取。可以使用管的all() 方法 获取所有对象 要创建这样一个子集,你需要在原始的的查询集上增加一些过滤
15、条件。两个最普遍的途径是: 查询参数(上面函数定义中的*kwargs)需要满足特定的格式,下面字段查询一节中会提到exclude(*kwargs) 返回一个新的查询集,它包含满足查询参数的对象。lter(*kwargs) 返回一个新的查询集,它包含满足查询参数的对象。all() 方法返回一个包含数据库表中所有记录查询集。但在通常情况下,你往往想要获取 的是完整数据集的一个子集。 使用过滤获取特定对象 :Entry.objects.all().filter(pub_dateyear=2006)用默认的管,它相当于 Entry.objects.filter(pub_dateyear=2006)要获
16、取份为2006的所有文章的查询集,可以使用 lter()方法使用过滤获取特定对象示 :头 发布日期在20051、 月30日至当天之间的所有记录。 这个子最开始获取数据库中所有对象的一个查询集,之后增加一个过滤,然后又增加一个 排除,再之后又是另外一个过滤。最后的结果仍然是一个查询集,它包含标题以”What“开 Entry.objects.filter( headlin estartswith=What).exclude(pub_dategte=datetime.date.today().filter(pub_dategte=datetime(2005, 1, 30)查询集的筛选结果本身还是查询
17、集,所以可以将筛选语链接在一起。像这样 链式过滤 q1 = Entry.objects.filter(headlinestartswith=What) q2 = q1.exclude(pub_dategte=datetime.date.today() q3 = q1.filter(pub_dategte=datetime.date.today()每次你筛选一个查询集,得到的都是全新的另一个查询集,它和之前的查询集之间没有任何绑 定关系 每次筛选都会创建一个独立的查询集,它可以被存储及反复使用。 。 过滤后的查询集是独立的 查询集是惰性执的 创建查询集会带来任何数据库的访问。你可以将过滤保持一整
18、 天,直到查询集需要求值时,Dq= Entry.objects.filter(headlinestartswith=What)q= q.filter(pub_datelte=datetime.date.today()q= q.exclude(body_texticonta=food)print(q) 一般来说,只有在“请求”查询集的结果时才会到数据库中去获取它们。当你确实需要结果时,查询集通过访问数据库来求值 虽然它看上去有三次数据库访问,但事实上只有在最后一(print(q))时才访问一次数据库。jango 才会真正运这个查询。 查询集是惰性执的 lter()始终给你一个查询集,即使只有一个
19、对象满足查询条件这种情况下,查询集将 。:g这个异常是正在查询的模型类的一个属性 DoesNotExist异常 所以在上面的代码中, 。 Django 将引发一个Entry.DoesNotExist。 的,MultipleObjectsReturned,它同样是模型类自身的一个属性。 Django 也将报错。这种情况将引发 如果有多条记录满足get() 的查询条件如果没有主键为1Entry 对象,et() 将引发一个使用get() 和使用 lter() 的切片0 有一点区别。如果没有结果满足查询,可以对get() 使用任何查询表达式,和 lter() 一样象只包含一个元素获取一个单一的对象ge
20、t()one_entry = Entry.objects.get(pk=1)如果你知道只有一个对象满足你的查询,你可以使用管的ge t() 方法,它直接返回该对 。 Entry.objects.all():5 Entry.objects.all()5:10可以使用Python的切片语法来限制查询集记录的数目。它 等同于SQL 的LIMIT 和OFFSET 子限制查询集 exclude() 和。 ()in 在给定的表内istartswith, iendswithstartswith,endswith以指字字符开头或结尾iconta大小写感的包含指定字符大小写感的包含指定字符contaiexact
21、 大小写感的匹配exact“精确”匹配 Entry.objects.filter(pub_datelte=2006-01-01) SELECT * FROM blog_entry WHERE pub_date Blog.objects.get(id=14) Blog.objects.get(idexact=14) Entry.objects.get(headlineexact=Man bites dog) SELECT . WHERE headline = Man bites dog; Django 提供一个查询快捷方式pk ,它表示“p rimary key” 的意思 查询的快捷方式pk B
22、log.objects.get(id=14) Blog.objects.get(pk=14) Blog.objects.get(idexact=14) -pub_date 前面Entry.objects.order_by(?)的负号表示降序排序。隐式的是升序排序。若要随机排序,请使用?,像这样: 上面的结果将按照p ub_date降序排序,然后再按照headline升序排序。Entry.objects.filter(pub_dateyear=2005).order_by(-pub_date, headline)给每个QuerySet 指定特定的排序QuerySet根据模型Meta类的order
23、ing选项排序。你可以使用order_by方法默认情况下,order_by 。,。 User.objects.values(id, username)有字段的键和值每个字典将只包含指定的字段的键/值。如果没有指定字段,每个字典将包含数据库表中所 values() 接收可选的位置参数*elds,它指定SELECT 应该限制哪些字段。如果指定字段每个字典表示一个对象,键对应于模型对象的属性名称返回一个ValuesQuerySet QuerySet 的一个子类,迭代时返回字典而是模型实对 象values values_list() 调用的字段的值 所以第一个元素为第一个字段,以此类推。 User.o
24、bjects.values_list(id, username)与values() 类似,只是在迭代时返回的是元组而是字典。每个元组包含传递给 values_list 在一些复杂的数据建模情况下,您的模型可能包含大字段,其中一些可能包含大数据 User.objects.defer(username, email)(如,文本字段),或者需要昂贵的处来将它们转换为Python对象。如果您在某些情 况下使用查询集的结果,当您最初获取数据时知道是否需要这些特定字段,可以告诉 Django要从数据库中检索它们。 defer Entry.objects.filter(pub_dateyear=2005).
25、delete()删除对象使用delete()。这个方法将立即删除对象且没有返回值。删除对象 拷贝过来。最简单的方法是,只需要将pk 设置为None。blog = Blog(name=My blog, tagline=Blogging is easy)blog.save() # blog.pk = 1blog.pk = Noneblog.save() # blog.pk = 2虽然没有内建的方法用于拷贝模型实,但还是很容创建一个新的实并让它的所有字段都 拷贝模型实 数可能和被新的数相等)update() 方立即执并返回查询匹配的数(如果有些已经具有新的值,返回的Entry.objects.filter(pub_dateyear=2007).update(headline=Everything is the same)新对象使用update()新对象 order = Order.objects.get(orderid=123456789)order.amount += 1order.save()fro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建立高效的财务业务运作模式
- 2025年全球及中国工业级4-苄氧基苯酚行业头部企业市场占有率及排名调研报告
- 2025年全球及中国石墨片保护膜行业头部企业市场占有率及排名调研报告
- 2025年全球及中国消费电子NFC天线行业头部企业市场占有率及排名调研报告
- 2025年全球及中国旅游广告和营销服务行业头部企业市场占有率及排名调研报告
- 2025-2030全球非侵入式血流动力学监测解决方案行业调研及趋势分析报告
- 2025年全球及中国光伏舟托行业头部企业市场占有率及排名调研报告
- 2025年全球及中国晶须碳纳米管行业头部企业市场占有率及排名调研报告
- 2025年全球及中国溴化钙粉行业头部企业市场占有率及排名调研报告
- 2025-2030全球高压镍氢电池行业调研及趋势分析报告
- 2024年江苏农牧科技职业学院高职单招语文历年参考题库含答案解析
- 广联达智慧工地合同范例
- 老年上消化道出血急诊诊疗专家共识2024
- 广东省广州黄埔区2023-2024学年八年级上学期期末物理试卷(含答案)
- 医院护理10s管理
- 人教版一年级下册数学第五单元认识人民币练习
- 学校安全工作计划及行事历
- 《GMP基础知识培训》课件
- 2025届江苏省无锡市天一中学高一上数学期末质量检测试题含解析
- 数学家华罗庚课件
- 贵州茅台酒股份有限公司招聘笔试题库2024
评论
0/150
提交评论