Django模型

一、model 文件中的类的建立:

对应的是数据库中的每个表,类中有什么字段,表就会对应的生成某个字段,主键id字段会自己生成;

数据库中的文件获取:只能通过模型类.objects来获取,不能通过模型类的实例获取;

对model中的代码进行增删改:先执行python manage.py makemigrations让修改动作保存到记录文件中,然后进行python manage.py migrate 让实际的操作应用到数据库中。
还有隐藏字段:_state 详情见https://www.liujiangblog.com/course/django/95第一章,模型和字段

__str__方法,用于返回实例对象的打印字符串;
get_abosolute_url()方法,返回每个模型实例的相应的访问url;
hash()方法,给模型实例提供唯一的哈希值,一旦生成就不允许修改

字段名:不能用,pass,两个下划线,下划线结尾

二、常用的Filed字段:

BooleanField:布尔类型,默认值时None,表单标签是checkboxinput,如果设置参数null=True,则表现为NullBooleanSelect选择框;

CharField:字符串类型,必须接收一个max_length参数,表单标签是text input;
DateField:日期类型,两个重要参数:(参数互斥,不能共存) auto_now:每当对象被保存时将字段设为当前日期,常用于保存最后修改时间。auto_now_add:每当对象被创建时,设为当前日期,常用于保存创建日期(注意,它是不可修改的)。设置上面两个参数就相当于给field添加了editable=False和blank=True属性。如果想具有修改属性,请用default参数。例子:pub_time = models.DateField(auto_now_add=True),自动添加发布时间。表单标签是DateInput;

DateTimeField:比上一个多了小时,分,秒的显示;
DecimalField:固定精度的十进制小数。相当于Python的Decimal实例,必须提供两个指定的参数!参数max_digits:最大的位数,必须大于或等于小数点位数 。decimal_places:小数点位数,精度。 当localize=False时,表单标签是NumberInput,否则是textInput类型。例子:储存最大不超过999,带有2位小数位精度的数,定义如下:models.DecimalField(…, max_digits=5, decimal_places=2);
EmailField:邮箱类型,默认max_length最大长度254位。使用这个字段的好处是,可以使用Django内置的EmailValidator进行邮箱格式合法性验证;

FileField:上传文件字段(不能设置主键),表单标签是ClearableFileInput标签;class FileField(upload_to=None, max_length=100, **options),upload_to用于设置上传地址的目录和文件名,也可以接收一个回调函数,该函数返回具体的路径字符串。回调函数中包含了instance参数和filename参数;

FilePathField:class FilePathField(path=‘’, match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options);用来保存文件路径信息的字段;

ImageField:ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options),同上,需提前安装pillow模块;这两个也需要在配置文件中,配置MEDIA_ROOT(上传文件在服务器的基本路径)和MEDIA_URL(指向上传文件的基本路径);假设你有一个ImageField字段,名叫mug_shot,那么在Django模板的HTML文件中,可以使用{{ object.mug_shot.url/size/name }}来获取该文件。其中的object用你具体的对象名称代替。

IntegerField:整数类型,表单标签是NumberInput或者TextInput;
GenericIPAddressField:class GenericIPAddressField(protocol=‘both’, unpack_ipv4=False, **options),IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4。在HTML中表现为TextInput标签。参数protocol默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。

TextField:用于储存大量的文本内容,表单标签是textarea;
URLField:一个用于保存URL地址的字符串类型,默认最大长度200;
UUIDField:用于保存通用唯一识别码(Universally Unique Identifier)的字段。注意不要写成default=uuid.uuid4()。

三、关系类型字段

外键要放在‘多’的一方,对于关系字段,第一位置参数永远是关系对象,不能是verbose_name;
多对一:ForeignKey
其中on_delete后的参数
● CASCADE:模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!
● 还有其他的参数,详情见https://www.liujiangblog.com/course/django/96,第一章,关系字段;
其中还有limit_choices_to等其他参数,详情见同上

多对多:ManyToManyField,只能选择一个模型设置该字段
里面有through参数,定义在
class Person(models.Model):
name = models.CharField(max_length=50)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person,
through=‘Membership’, ## 自定义中间表
through_fields=(‘group’, ‘person’), )
class Membership(models.Model): # 这就是具体的中间表模型
group = models.ForeignKey(Group, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
inviter = models.ForeignKey(Person,on_delete=models.CASCADE,related_name=“membership_invites”, )
invite_reason = models.CharField(max_length=64)
定义了一个新的模型,用来保存Person和Group模型的多对多关系,并且同时增加了‘邀请人’和‘邀请原因’的字段。而且必须显式的指定through_fields参数,用于定义关系。through_fields参数指定从中间表模型Membership中选择哪两个字段,作为关系连接字段。
一对一:OneToOneField

四、创建表的时侯的模型元数据class Meta:

其下面的主要字段:
db_table,指定在数据库中,当前模型生成的数据表的表名;
ordering,排序,加‘-’表示降序排列,不加则表示升序排列,可以在其后面再加字段,对什么进行排序;
idexes,接收一个应用在当前模型上的索引列表,models.Index(fields=[‘last_name’, ‘first_name’]);
verbose_name,设置模型对象的名称。

五、模型的继承

1、想让抽象基类的子模型成为一个抽象基类,那必须显式的在该子模型的Meta中同样声明一个abstract=True;
2、在多表继承中,如不想让子类继承父类的ordering和get_latest_by参数,就必须在子类中显示的指出或重写;
3、声明一个代理模型只需在Meta中proxy的值设为True。

六、model的查询操作

1、创建对象:模型类的实例化构造,然后save( )方法保存;或者 类.objects.create( )方法创建
或者直接在模型类中增加create方法和自定义管理器并在其中添加创建对象的方法;
2、修改对象并保存:在其中千万不要忘记super().save( *args,**kwargs),这行确保了Django源码中关于save方法的代码会依然被执行。只有执行save方法后才会将数据写入数据库。
3、F表达式:entry = Entry.objects.get(name=‘刘江的博客’)
>>> entry.number_of_pingbacks = F(‘number_of_pingbacks’) + 1
>>> entry.save()
Django设计的这个F表达式在获取关联字段值的时候不用先去数据库中取值然后在Python内存里计算,而是直接在数据库中取值和计算,直接更新数据库,不需要在Python中操作,自然就不存在数据竞争和冲突问题了。
4、希望结果是哪个模型的实例,就用哪个,模型去调用;Blog.objects.xxx
5、QuerySet的切片:
Entry.objects.all()[:5] # 返回前5个对象
Entry.objects.all()[5:10] # 返回第6个到第10个对象
注意:不支持负索引!例如 Entry.objects.all()[-1]是不允许的
指定步长的时候,查询操作会立刻在数据库内执行,>>> Entry.objects.all()[:10:2]
6、字段查询:键名__字段=指定的内容
字段有:regex区分大小写的正则表达式匹配,iregex不区分大小写。。。等字段
7、Q对象
可以使用&或者|或~来组合Q对象,分别表示与、或、非逻辑。它将返回一个新的Q对象。
Q(question__startswith=‘Who’)|Q(question__startswith=‘What’)
这相当于:WHERE question LIKE ‘Who%’ OR question LIKE ‘What%’
8、判断基于以下逻辑:
● 同一模型下,主键相等则实例相等
● 主键为None时,和任何实例都不相等
● 实例等于自己本身
● 代理模型的实例等于相同主键的父类实例
● 多表继承时,哪怕主键值相等,实例也不相等

七、不返回QuerySet的API

get() 获取单个对象,注意其查询的对象只能有一个,不然就报错;
create() 创建对象,无需save(),同时创建并且保存对象的方法;
get_or_create() 查询对象,如果没有找到就新建对象,建议只在post请求中这样使用,不然不安全;
update_or_create() 更新对象,如果没有找到就创建对象;
count() 统计对象的个数,永远不会引发异常;
latest() 获取最近的对象,其本质就是先排序,然后获取最前面的那个对象;
earliest() 获取最早的对象,获取最早先的对象;
first() 获取第一个对象,返回结果集的第一个对象,当没有找到好似就返回None;
last() 获取最后一个对象,返回结果集的最后一个对象;
aggregate() 聚合操作,见后面的章节;
exists() 判断queryset中是否有对象,查询其在不在;
update() 更新对象,对指定的字段执行更新操作,并返回匹配行数,
delete() 删除对象

八、注解与聚合

● aggregate: [ˈæɡrɪɡət ] ,聚合。做一些统计方面的工作。返回的是聚合后的数据字典;
● annotate: [ˈænəteɪt],注解。为返回的查询集添加一些额外的数据。返回的依然是查询集。
其中的Avg,Sum,Count,Max,Min等其他的聚合函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TikTok与虚拟现实的完美交融:全新娱乐时代的开启

TikTok,这个风靡全球的短视频平台,与虚拟现实(VR)技术的深度结合,为用户呈现了一场全新的娱乐盛宴。虚拟现实技术为TikTok带来了更丰富、更沉浸的用户体验,标志着全新娱乐时代的开启。本文将深入探讨TikTok…

数据结构与算法-动态规划-买卖股票的最佳时机

买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交…

C# WPF上位机开发(内嵌虚拟机的软件开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习过halcon的同学都知道,它不仅有很多的图像算子可以使用,而且调试很方便。每一步骤的调试结果,都可以看到对…

C语言内存池的使用场景和代码示例

当然可以。在C语言中,内存池是一种用于管理内存分配的技术。使用内存池可以避免频繁地申请和释放内存,从而提高内存的使用效率,并减少内存碎片。内存池的使用场景主要包括需要频繁分配和释放相同大小的内存块的情况。下面是一个简单的C语言代…

什么是云际计算?SD-WAN在云际计算中的作用是什么?

在当今数字化时代,云计算已经成为企业处理数据和应用程序的主要方式。然而,随着物联网设备数量的增加和对实时性要求的提高,传统的集中式云计算模型面临一些挑战。为了解决这些问题,云际计算(Edge Computing&#xff0…

TDengine Kafka Connector将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine

教程放在这里:TDengine Java Connector,官方文档已经写的很清晰了,不再赘述。 这里记录一下踩坑: 1.报错 java.lang.UnsatisfiedLinkError: no taos in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.j…

亚马逊、速卖通、虾皮等平台有哪些测评补单方案,哪个比较好用

随着全球电子商务的迅速发展,跨境电商环境的潜力和机遇日益显现。跨境卖家们可以更便捷地将产品销售到全球市场,但同时也面临着更激烈的竞争、更严格的规定和更高的运营成本等挑战。在这个环境中,如何抓住机遇并克服挑战,成为了所…

Harmony OS基本介绍

作为华为最新的操作系统,Harmony OS在全球范围内引起了广泛的关注和探讨。它是一款开放、协同、可定制的智能终端操作系统,可以在不同的设备上实现无缝的互联互通。在本篇文章中,我们将对Harmony OS的使用做一个总结,分别从以下几…

数据库系统相关概念

数据:描述事务的符号记录。 数据库(DB):按一定的数据模型组织,描述和存储在计算机内的,有组织的,可共享的数据集合。 数据库管理系统(DBMS):位于用户和操作系统之间的一层数据管理软件。主要功能包括&#…

基于Qt的蓝牙Bluetooth在ubuntu实现模拟

​# 前言 Qt 官方提供了蓝牙的相关类和 API 函数,也提供了相关的例程给我们参考。笔者根据 Qt官方的例程编写出适合我们 Ubuntu 和 gec6818开发板的例程。注意 Windows 上不能使用 Qt 的蓝牙例程,因为底层需要有 BlueZ协议栈,而 Windows 没有。Windows 可能需要去移植。笔者…

Java 值传递、引用传递

开始之前,我们先来搞懂下面这两个概念: 形参&实参值传递&引用传递 方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为: 实参(实际参数,Arguments)…

js中常用的字符串操作!!!

1.字符串的长度 // 字符串常用的操作 let str1 "qwasaertrayuasdf"; let str2 "asdfzcxfv"; // 1.字符串的长度 console.log(str1.length);2. charAt() : 返回指定索引位置的字符 // 字符串常用的操作 let str1 "qwasaertrayuasdf"; let str2…

jemeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下: {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件,配置如下: 若断言成功,则查看结果树的接口显示绿色,若…

python自动化测试实战 —— 自动化测试框架的实例

软件测试专栏 感兴趣可看:软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识: 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

python+pytest接口自动化(10)-session会话保持

在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示请登录,那么怎样解决呢? 上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一。 另外一种方式则是通过session进行会…

【python】魔术方法大全——基础篇

什么是魔术方法 所谓魔法方法,它的官方的名字实际上叫special method,是Python的一种高级语法,允许你在类中自定义函数,并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动…

MySQL笔记-第12章_MySQL数据类型精讲

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第12章_MySQL数据类型精讲1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4…

RabbitMQ Streams 详解

RabbitMQ Streams是一种持久复制数据结构,可以完成与队列相同的任务:它们缓冲来自生产者的消息,这些消息由消费者读取。然而,流与队列的区别在于两个重要方面:消息的存储和消费方式。 Streams为仅追加的消息日志建模&a…

希亦|鲸立|小吉内衣洗衣机好用吗?强势PK“洗护一体”王者!

随着人们的生活水平的提升,越来越多小伙伴来开始追求更高的生活水平,一些智能化的小家电就被发明出来,而且内衣洗衣机是其中一个。我们对内衣裤的清洗频次会高于普通衣服,大多数人会选择手洗内衣裤,都在手洗过程不仅会…

会计学上机实验

使用说明: 蓝色标记提示需要明细核算最后算出来的净利润为 732150本文不是标准答案,老师也没给标准答案 1. 10 月 1 日,盛达有限责任公司成立,注册资本(实收资本)800 万人民币,其中&#xff1a…