Django ORM中常用字段类型与参数

2023-11-19

ORM中常用字段类型与参数
ORM中一个模型类对应的是数据库中的一张表,对象对应的是数据库中的记录,属性则对应的是字段。此篇为章主要整理的是常用的字段类型和对应的参数。
字段类型
1.自增长字段
# 自增长
id = models.AutoField(primary_key=True) # 系统会默认添加此字段,无需用户自己特地添加
id = models.BigAutoField()
自增长字段的意思是,数据表中每增加一条记录,这个字段的值就会自动加1。字段的类型默认为Int整型。下面的BigAutoField字段可容纳比较大的数,比如说十亿。但是需要注意的一点是,其实我们在定义数据库表结构的时候并不需要特地定义这样一个字段,因为Django会在每个表中自动添加一个id字段,且这个字段的类型正是自增长型。
2.二进制字段
# 二进制
Binary = models.BinaryField()
在某些特殊情况下,我们可以用此字段类型来插入二进制数据。
3.布尔型字段
# 布尔型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()
Django提供了两种布尔类型的字段,上面这种不能为空,下面这种的字段值可以为空。
4.整型字段
# 整型
PositiveSmallInteger = models.PositiveSmallIntegerField() # 5个字节 正数
SmallInteger = models.SmallIntegerField() # 6个字节 正负数
PositiveInteger = models.PositiveIntegerField() # 10个字节 正数
Integer = models.IntegerField() # 11个字节
BigInteger = models.BigIntegerField() # 20个字节
Django提供了5种不同的整型字段,可以按照两个标准来进行分类,一个是按正负数来分(Positive),一个是按数值大小来分(Small、Big)具体分类如上。
5.字符串类型
# 字符串类型
Char = models.CharField() # varchar
Text = models.TextField() # longtext
字符串类型的字段分为两种,上面这种对应数据库中的varchar,需要在参数max_length中指定字符串的大小。下面这种对应数据库中的longtext类型,无需指定字符串长度,想写多长就写多长。
6.时间类型
# 时间日期类型
Date = models.DateField()
DateTime = models.DateTimeField()
Duration = models.DurationField() # int, Python timedelta实现
时间类型分为三种,Date是年月日的形式,DateTime是年月日时分秒的形式,第三种表示一段时间,在数据表中是Int类型,它的底层是通过python的timedelta实现的。
7.浮点型
# 浮点型
Float = models.FloatField()
Decimal = models.DecimalField() # 11.22, 16.34
浮点型也有两种,其中第二种Decimal比较特殊,需要在参数中指定整数有多少位,小数有多少位。
8.其他类型
# 其它字段
Email = models.EmailField() # 邮箱
Image = models.ImageField() # 图片
File = models.FileField() # 文件
FilePath = models.FilePathField() # 文件路径
URL = models.URLField() # URL地址
UUID = models.UUIDField() # UID
GenericIPAddress = models.GenericIPAddressField() #IP地址,IPV4或者IPV6
另外,Django还为我们封装了其他更加高级的字段,从上往下依次是邮箱类型、图片、文件、文件路径、浏览器地址中输入的URL、UUID、Ip地址(IPV6或者是IPV4)
9.关系型字段
前面8种字段都是独立定义在单个表(类)中的字段,和其他的表没有任何关系。但在实际开发中我们不可能将我们项目中所有用到的数据都定义到一个表中,需要多个表的协同存储。
比如说在一个博客网站中,我们可以定义一个分类目录的表,专门用来存储文章的分类。还可以定义一个标签的表,专门用来存储文章涉及到的标签。其次就是我们的文章表,主要用来存储除了文章相关的信息。说到这里有人可能会有一个疑问,为什么不将分类目录和标签单独在定义一个表呢?
因为一个博客网站的文章可以有成千上百,但是分类目录和标签不会太多,如果在文章表中定义一个用来存储标签或者分类目录的字段,字段里存放的是目录和标签的字符串,那么可能会产生很多冗余信息。因为可能多个文章的分类目录标签的字段值都是一个字符串,这样就会浪费很多空间。如果我们和单独的一个分类目录的表进行关联,然后只在文章表的分类目录字段中存储某个分类在分类表中的ID号,那么就能够省下来很多的空间。因为数字比字符串占用的空间少!
因为那涉及到多个表的字段有那些呢?主要有多对多(ManyToManyField),一对一(OneToOneField),多对一(ForeignKey)这三种关系型字段。多对一可以理解为一篇文章只能有一个分类目录,但是一个分类目录可以有多篇文章,多对多可以理解为一篇文章可以有多个标签,一个标签可以有多篇文章对应。
# 分类目录表(附表)
class Category(models.Model):
# 分类名
name = models.CharField(max_length=100)
# 标签表(附表)
class Tag(models.Model):
# 标签名
name = models.CharField(max_length=100)
# 文章表(主表)
class Article(models.Model):
# 文章标题
title = models.CharField(max_length=100)
# 分类 一对多 参数要写上附表的类名
category = models.ForeignKey(Category)
# 标签 多对多 参数要写上附表的类名
tag = models.ManyToManyField(Tag)
字段参数
在原生SQL定义数据表的时候我们常常需要给字段设定一些参数,比如说是否为空,默认值等等。那么在Django的模型类中我们该如何设置呢?首先,我们要知道,Django字段的参数分如下三种情况:
1.所有字段都具有的参数
●1.更改字段名:db_colum=” “
●2.设置主键:primary_key=True,默认为False
●3.给字段设置别名(备注):verbose_name=” “
●4.字段的唯一键属性:unique=True,设置之后,这个字段的没一条记录的每个值是唯一的
●5.允许字段为空:null=True(数据库中字段可以为空),blank=True(网页表单提交内容可以为空),切记不可以将null设置为Fasle的同时还把blank设置为True。会报错的。
●6.给字段建立索引:db_index=True
●7.在表单中显示说明:help_text=” “
●8.字段值不允许更改:editable=False,默认是True,可以更改。
2.个别字段才拥有的参数
●1.CharField(max_length=100):字段长度为utf8编码的100个字符串
●2.DateField(unique_for_date=True):这个字段的时间必须唯一
●3.DateField(auto_now=True):对这条记录内容更新的时间
●4.DateField(auto_now_add=True):插入这条记录的时间
●5.DecimalField(max_digits=4, decimal_places=2):前者表示整数和小数总共多少数,后者表示小数点的位数
3.关系型字段的参数
on_delelte= 这个参数表示外键所关联的对象被删除的时候要进行什么操作,比如说一篇文章对应一个Python的分类,但是这个分类被你不小心删除了,那么这篇文章的分类应该会发生什么变化呢?主要有以下六种:
1CASCADE:模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!(该操作为当前Django版本的默认操作!)
2PROTECT:阻止上面的删除操作,但是弹出ProtectedError异常
3SET_NULL:将外键字段设为null,只有当字段设置了null=True时,方可使用该值。
4SET_DEFAULT:将外键字段设为默认值。只有当字段设置了default参数时,方可使用。
5DO_NOTHING:什么也不做。
6SET():设置为一个传递给SET()的值或者一个回调函数的返回值。注意大小写。
4.自关联字段参数
需要在第一个参数中添加‘self’字符串,或写上它自己的表名(模型类名)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django ORM中常用字段类型与参数 的相关文章

随机推荐

  • 为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!

    一 前情回顾 上篇文章给大家聊了一下volatile的原理 具体参见 入坑两个月自研非外包创业公司 居然让我搞懂了volatile 这篇文章给大家聊一下java并发包下的CAS相关的原子操作 以及Java 8如何改进和优化CAS操作的性能
  • 在Qt中如何实现窗口交互

    首先介绍done函数 它的作用是 关闭当前窗口 同时返回一个状态信息 Qt助手解释 关闭对话框并将其结果代码设置为r 如果这个对话框显示了exec done 导致本地事件循环结束 exec 返回r void QDialog done int
  • checkbox样式改写

    div class checkbox font s div
  • js 微观任务、宏观任务、循环机制

    javascript是单线程语言 就是因为单线程的特性 就不得不提js中的同步和异步 同步和异步 所谓单线程 无非就是同步队列和异步队列 js代码是自上向下执行的 在主线程中立即执行的就是同步任务 比如简单的逻辑操作及函数 而异步任务不会立
  • 计算机网络--绪论

    一 计网的体系结构 1 概念和功能 2 组成和分类 3 标准化工作及相关组织 二 性能指标 1 速率 2 带宽 3 吞吐量 4 时延 5 时延带宽积 6 往返时间RTT利用率 7 利用率 三 分层结构 1 分层 四 OSI参考模型 1 OS
  • 随机数产生方法

    5 产生一定范围随机数的通用表示公式 要取得 a b 的随机整数 使用 rand b a a 要取得 a b 的随机整数 使用 rand b a 1 a 要取得 a b 的随机整数 使用 rand b a a 1 通用公式 a rand n
  • 【Vue】Vue基础自用笔记&Day02_①Vue过滤器②按键修饰符③自定义指令

    Vue基础 Day02 1 Vue过滤器 2 按键修饰符 3 自定义Vue指令 1 Vue过滤器 Vue js 允许你自定义过滤器 可被用于一些常见的文本格式化 过滤器可以用在两个地方 双花括号 插值和 v bind 表达式 后者从 2 1
  • 袁红岗的编程感悟

    我自己知道 近几年也一直在用 但就是说不出来 直到最近几天才能够表达 叫作Think in Code 也就是用代码思考 同时也把代码当成自己思想表达的方式 正如哲学家用文字设计 诠释思想 程序员 说话 用的是代码 这就是一个程序员的境 界
  • 使用python实现简单全连接神经网络

    最近在学习神经网络的相关知识 特在此做一个笔记 python语言的功能很强大 可以使用很少的代码实现很多功能 因此大家如果想研究深度学习的话 一定要懂得python语言 这篇笔记记录我的第一次使用python编写神经网络代码的过程 其中代码
  • Centos7 ELK7.6.2集群搭建

    Centos7 ELK7 6 2集群搭建 ELK7 6 2网盘安装包下载 一 单节点准备 配置ip 配置主机名和主机名映射 关闭防火墙 事件同步 更换yum源 阿里云yum源 安装常用软件 系统优化 创建用来启动es的普通用户 jdk安装
  • 微信小程序(日历/日期)选择插件

    微信小程序日历选择器插件点击日历日期可以获取到年月日 wxml
  • stm32学习笔记——通用计时器基本原理

    stm32f10x最多有8个定时器 stm32f103zet6就有8个定时器 分别是4个通用定时器 2个高级定时器 2个基本定时器 定时器种类 位数 计时器模式 产生DMA请求 捕获 比较通道 互补输出 特殊应用场景 高级定时器 TIM1
  • Spring Boot 应用启动时 java.lang.reflect.InaccessibleObjectException 问题的解决

    Spring Boot 的应用启动的时候遇到下面的错误 java lang reflect InaccessibleObjectException Unable to make private native accessible Set c
  • windows下命令行修改系统时间;修改系统时间的软件

    找了很久 都没有找到 还找了关键词 dos下修改系统时间 因为看到linux下修改系统时间是用hwclock 命令写入主板芯片 而我由于某些原因想自动化修改系统时间 所以找windows下修改系统时间的软件 没有找到 有一个 意天禁止修改系
  • 图解Git

    基本用法 上面的四条命令在工作目录 暂存目录 也叫做索引 和仓库之间复制文件 git add files 把当前文件放入暂存区域 git commit 给暂存区域生成快照并提交 git reset files 用来撤销最后一次git add
  • UNITY一些关于旋转的问题

    实现平滑的旋转 旋转的目的是为了朝向目标物体 untiy中的旋转rotation是一个四元数 在代码里面我们可以用Quaternion 来记录一个人物角色的最初的旋转角度 注意 这个要在awake里赋值 目的是取得该值 为了实现平滑的旋转
  • 关于powershell中错误:无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案

    在利用ffmpeg进行格式转换时报错 无法将 ffmpeg 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 发现是改动了ffmpeg所在根文件夹名字 导致path环境变量找不到ffmpeg程序 改动环境变量就正常了 快速打开环境变
  • protobuf对象 转为Json串写入elastic search遇到的问题总结

    背景 从kafka中消费数据后拿到的是protobuf序列化后的字节数组 转化为Java中的proto对象后 需要将这些protocol对象继续处理成Json串写入elasticsearch 各种问题 Json工具选择 刚开始尝试使用fas
  • Failed to convert property value of type 'java.lang.String' to required type 'int' for property

    junit Spring 测试Service org springframework beans TypeMismatchException Failed to convert property value of type java lan
  • Django ORM中常用字段类型与参数

    ORM中常用字段类型与参数 在ORM中一个模型类对应的是数据库中的一张表 对象对应的是数据库中的记录 属性则对应的是字段 此篇为章主要整理的是常用的字段类型和对应的参数 字段类型 1 自增长字段 自增长 id models AutoFiel