Django框架之ORM和模型属性

news2024/11/18 7:51:19

Django对很多数据库都有支持,为这些数据库提供了统一的调用API。可以根据不同的业务需求,选择配置不同的数据库。本篇文章主要介绍ORM和模型属性。

ORM

ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行。

优点

根据对象类型生成表结构;将对象、列表操作转换为sql语句;将sql语句查询的结构转换为对象、列表。能够极大地减轻了开发人员的工作量。

图解

 

定义属性

 

Django根据属性的类型确定以下信息:

1.当前选择的数据库支持字段的类型

2.渲染管理表单时使用的默认html控件

3.在管理站点最低限度的验证

模型、属性、表、字段关系

一个模型类在数据库中对应一张表,在类中定义的属性,对应模型对照表中的一个字段。

主键列

Django会为表增加自动递增的主键列,每个模型只能有一个主键列,如果设置某属性为主键列后,则django不会再生成默认的主键列

指定主键

id = models.AutoField(primary_key=True)

属性命名

遵循标识符规则,不能是python的保留关键字

由于django的查询方式,不允许使用连续的下划线

模型库

定义属性时,需要定义字段类型,字段类型被定义在django.db.models.

fields目录下,为了方便使用,被导入到django.db.models中。

使用方式

导入from django.db import models

通过models.field创建字段类型的对象,赋值给属性。

逻辑删除

对于重要数据都做逻辑删除,不做物理删除。

实现方法是定义isDelete属性,类型为booleanField,默认值为False。

字段类型

AutoField

一个根据实际ID自动正常的IntegerField,通常不指定。

如果不指定一个主键字段将自动添加到模型中

models.AutoField(primary_key=True)

CharField(max_length=字符长度)

字符串,默认的表单样式是TextInput

models.CharField(max_length=20)

TextField

大文本字段,一般超过4000使用,默认的表单控件是Textarea

models.TextField()

IntegerField 整数

models.IntegerField()

DecimalFiled(max_digits=None, decimal_places=None)

使用python的decimal实例标识的十进制浮点数

参数说明

DecimalField.max_digits:位数总数,例如123.45就是5位

DecimalField.decimal_places:小数点后的数字位数

models.DecimalField(max_digits=5, decimal_places=2)

FloatField

用python的float实例来表示的浮点数

models.FloatField()

BooleanField

True/False 字段,此字段的默认表单控制是checkboxInput

models.BooleanField()

NullBooleanField

支持使用null/true/false三重值

models.NullBooleanField()

DateField([auto_now=False, auto_now_add=Fasle])

使用python的datetime.date实例表示的日期

models.DateField()

参数说明

DateField.auto_now

每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”的时间戳。

它总是使用当前日期,默认为False

Datefield.auto_now_add

当对象第一次被创建时自动设置当前时间,用于创建的时间戳,总是使用当前日期,默认为false。

说明:该字段默认对应的表单控件是一个TextInput。在管理员站点添加了一个javascript写的日历控件,和一个“today”的快捷按钮,包含了一个额外的invalid_date错误信息键

注意:Auto_now_add,auto_now,and default这些设置是互相排斥的,他们之间的任何组合将会发生错误的结果

TimeField

使用python的datetime.time实例表示的时间,参数同DateField

models.TimeField()

DateTimeField

使用python的datetime

Datetime实例表示的日期和时间,参数同DateField

models.DateTimeField()

FileField

一个上传文件的字段

该字段不允许使用primary_Key属性。包含两个可选参数:FileField.upload_to和FileField.storage。FileField.upload_to表示文件上传后的保存位置。

ImageField

继承FileField字段的全部属性与方法,但是仅允许上传图片类型文件。

为了设置图片显示的高度与宽度,ImageField字段额外提供了两个属性:

ImageField.height_field,图片高度。

ImageField.width_field,图片宽度。

字段选项

通过字段选项,可以实现对字段的约束;在设置字段对象时通过关键字参数指定。

null

如果为True,django将控制以null存储到数据库中,默认值是False

blank

如果为True,则该字段允许为空,默认值是Fasle

注意:与Field.null属性不同的是,null只是表示数据库值是空的,而blank用于表单验证。当字段属性blank=True时,表单验证将允许字段值为空,但是,当blank=False时,表单字段将变成必填字段。

db_column

字段的名称,如果未指定,则使用属性的名称

db_index

若值为True,则在表中会为此字段创建索引

default

默认值

primary_Key

若为True,则该字段会成为模型的主键字段

unique

如果为True,这个字段在表中必须有唯一性

choices

属性值为一个可迭代对象,如列表或者元组,迭代对象的每个成员包括两个元素。当字段设置choices属性时,字段在网页中将会以下拉列表的形式显示。列表或元组的第一个值将作为字段值保存到数据库中,第二个值用于提高字段的可读性。

示例:

Student_Hobby_Choice = [
    ('足球', '踢足球看足球比赛'),
    ('篮球', '踢篮球看篮球比赛'),
    ('羽毛球', '踢羽毛球看羽毛球比赛'),
]
hobby = models.CharField(max_length=20, 
choices=Student_Hobby_Choice, default='足球')

效果如下:

help_text

额外的“帮助”文本,随表单控件一同显示,在文本中可以使用HTML标记。

示例:

desc = models.CharField(max_length=20, 
help_text="可填写该学生的<em> 自我描述或评价 </em>")

效果如下:

表与表之间关系

分类

Foreignkey:一对多,将字段定义在多的端中

ManyToManyField:多对多,将字段定义在关系表模型中

OneToOneField:一对一,将字段定义在任意一端中

用一访问多

格式:对象.模型类消息_set

示例:Grades.students_set

访问id

格式:对象.属性_id

示例:Students.grade_id

定义模型

myapp/models.py

from django.db import models



class Grades(models.Model):

    """ 班级表模型 """

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    boy_num = models.IntegerField()
    girl_num = models.IntegerField()
    create_time = models.DateTimeField()



class Students(models.Model):

    """ 学生表模型 """

    name = models.CharField(max_length=20)
    gender = models.BooleanField(default=True)
    age = models.IntegerField()
    desc = models.CharField(max_length=20)
    isDel = models.BooleanField(default=False)

    # 设置与班级表关联外键 一对多外键设置在多的模型中
    # CASCADE 级联操作
    grades = models.ForeignKey("Grades", on_delete=models.CASCADE)

元属性

元属性是“模型中任意非模型字段的内容”,例如排序功能、数据表名、人类可读的名字(单数形式和复数形式),所有元属性都是可选的。通过在模型中添加一个叫作Meta的子类。

db_table 定义数据表名称,推荐使用小写字母。

如果不写数据表明默认为项目名小写_类名小写

ordering 对象的排序字段,获取对象的列表时使用

ordering['id'] 升序

ordering['-id'] 降序,默认降序

注意:排序会增加数据库的开销

class Students(models.Model):
    """ 学生表模型 """

    class Meta:
        # 表名称
        db_table = 'myapp_students'
        # 排序
        ordering = ['-id', 'gender']

Indexes用来定义数据库索引,形式如下:

indexes = [
    models.Index(fields=['name', 'age']),
    models.Index(fields=['name'], name='name')
]

表迁移

新增表字段或者表结构变化,需要进行表迁移。

生成表迁移文件

python manage.py makemigrations

执行表迁移

python manage.py migrate

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

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

相关文章

JAVAWeb11-服务器渲染技术 -JSP-01-JSP基础

1. 现状 1、JSP 使用情况 2、Thymeleaf 使用情况, 通常和 SpringBoot 结合(也会讲) 3、Vue 使用情况 2. 学 JSP 前&#xff0c;老师要说的几句话 目前主流的技术是 前后端分离 (比如: Spring Boot Vue/React), 我们会讲的.[看一下]JSP 技术使用在逐渐减少&#xff…

06 - 4 微内核架构

什么是微内核架构 定义 微内核 核心功能资源封装 插件 可插拔 系统核心 资源封装 硬件接口系统资源访问接口环境/上下文&#xff08;context&#xff09;访问接口系统事件接口 定义插件规范 使用场景规则条件 核心功能 支持系统运作的最小功能集 职责分离 通用流程由核心…

音视频八股文(10)-- mp4结构

介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14&#xff0c;出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器&#xff0c;⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。&#xff08;顺便⼀提&#xff0c;⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10&#xff09…

CTF权威指南 笔记 -第三章汇编基础-3.2-x86/x64汇编基础

这节介绍PC最常见的架构 x86和扩展 x64框架 CPU操作模式 对x86处理器而言 有三个最主要的保护模式 保护模式 实地址模式 系统管理模式还有一个保护模式的子模式 虚拟8086模式 保护模式 保护模式是处理原生状态 这个时候所有指令和特性都是可以使用的 分配给程序的独立内…

好用的原型设计软件有哪些?一次给你推荐12个

原型设计是项目需求可视化的过程&#xff0c;从事产品设计工作必须与产品原型的创建分不开&#xff0c;因此原型设计软件的选择不容忽视&#xff0c;一个好的原型设计软件&#xff0c;不仅能有效输出页面设计&#xff0c;规范产品原型&#xff0c;而且能有效降低开发和设计人员…

debootstrap 构建 RISC-V 64 Ubuntu 根文件系统

debootstrap 构建 Ubuntu RISC-V Linux 根文件系统 flyfish 主机信息 命令 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal制作的根文件系统为 RISC-V 64 Ubuntu 22.04 LTS 1 主机…

Spring框架入门

Spring框架入门 简介开发环境入门案列Spring bean的定义常用属性 Spring IOC (控制反转)简介控制反转&#xff08;IoC&#xff09;案例 依赖注入&#xff08;DI&#xff09;IoC 容器的两种实现ApplicationContextBeanFactory Spring Bean属性注入构造函数注入setter 注入 Sprin…

洛谷 P2782 友好城市 线性DP 最长上升子序列 二分查找 lower_bound

&#x1f351; 算法题解专栏 &#x1f351; 洛谷&#xff1a;友好城市 题目描述 有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸&#xff0c;而且不同城市的友好城市不相同。每对…

关于HTTP服务小实验。

请给openlab搭建web网站 ​网站需求&#xff1a; ​1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](ht…

充电桩测试设备TK4800充电桩现校仪检定装置

TK4800是一套专用于检定电动汽车非车载充电机现场校验仪和电动汽车交流充电桩现场校验仪的装置&#xff0c;充电桩测试设备装置针对新能源汽车充电动态特性进行设计&#xff0c;支持稳态电能计量&#xff08;针对恒定负载&#xff09;和动态电能计量&#xff08;针对波动性负载…

.NET中mysql 找不到请求的 .Net Framework Data Provider。可能没有安装。

如果你遇到 “找不到请求的 .Net Framework Data Provider。可能没有安装”这个问题&#xff0c;其他方式都试过了还不行&#xff0c;就试试下面这个方法吧&#xff0c;每次遇到同样的报错可能是不同的原因引起的&#xff0c;要具体排查尝试&#xff0c;反正我都遇到了个遍&…

Gitlab自动触发jenkins完成自动化构建

jenkins 首先安装gitlab插件&#xff0c;我已经安装过了&#xff0c;首次请在可选插件中进行搜索。 进入项目配置--构建触发器&#xff1a; Build when a change is pushed to GitLab. GitLab webhook URL: 请复制此处的URL&#xff0c;后续有用。 然后点击高级 “Allowed br…

拨云见日:深入理解 HTML 解析器与有限状态机

文章目录 参考描述状态机状态机有限状态机与无限状态机有限状态机与自动售货机无限状态机与计算器 HTML 解析器HTML 解析器HTML 与有限状态机 HTML 解析器的常见状态初始状态DOCTYPE 状态注释状态标签状态开始标签状态属性状态属性名状态属性值状态 结束标签状态自闭和标签状态…

大象起舞的秘密:深度剖析酒店“航母”时代新战略

4月19日-21日&#xff0c;因疫情阔别近两年的中国酒店投资及酒店产业系列展&#xff08;简称HFE&#xff09;在上海世博展览馆盛大举办&#xff0c;作为疫后首个举办的行业领先的酒店业展览会&#xff0c;本届HFE备受关注。 “品牌航母”锦江酒店&#xff08;中国区&#xff09…

springboot 整合 sharding-jdbc 主从 读写分离

目录 0 课程视频 1 mysql 主从搭建 1.1 docker mysql 主从搭建 1.2 非docker mysql 主从搭建 2 springboot sharding-jdbc 主从 读写分离 2.1 pom 加依赖 2.1 yml 配置文件 2.2 druid数据源冲突解决 -> 视频15:20 秒处 2.3 注入数据源对象 3 测试 -> 直接使用 …

Java使用Milo实现OPC UA客户端,封装spring boot starter

文章目录 一、milo库二、OPC UA服务端三、工具使用3.1 依赖3.2 配置3.3 连接池3.4 写3.4.1 通用类型3.4.2 已提供方法的类型3.4.3 其他类型 3.5 读3.6 遍历节点 一、milo库 由eclipse开源&#xff0c;地址&#xff1a;https://github.com/eclipse/milo&#xff0c;可以基于此开…

ChatGPT如何提问?30句ChatGPT提问公式,快收藏

在使用ChatGPT过程中&#xff0c;总感觉用chatgpt的效果没有那么好。经过多次使用和摸索&#xff0c;终于发现了问题&#xff0c;原来不是ChatGPT不好用&#xff0c;效果不好&#xff0c;而是因为我之前不会提问。 话不多说&#xff0c;给大家准备了30句ChatGPT提问公式 1、撰…

Python入门(四)列表(一)

列表&#xff08;一&#xff09; 1.列表简介1.1 什么是列表&#xff1f;1.2 访问列表元素 2.修改、添加和删除列表元素2.1 修改列表元素2.2 在列表中添加元素2.2 从列表中删除元素 作者&#xff1a;Xiou 1.列表简介 列表让你能够在一个地方存储成组的信息&#xff0c;其中可以…

【并发编程】探索可见性背后的本质以及vloatile原理

文章目录 可见性造成不可见性的原因缓存一致性指令重排序 JMMvloatile原理Happens-Before模型案例说明 可见性 在单线程的环境下&#xff0c;如果向一个变量先写入一个值&#xff0c;然后在没有写干涉的情况下读取这个变量的值&#xff0c;那 这个时候读取到的这个变量的值应该…

java学习之异常

目录 一、引出异常 实例 运行结果 二、异常体系图 三、五大运行时异常 一、NullPointerException 空指针异常 二、ArithmeticException 数学运算异常 三、ArrayIndexOutOfBoundsException 数组下标越界异常 四、ClassCastException 类型转换异常 ​编辑五、 NumberFormat…