在ORM中一个模型类对应的是数据库中的一张表,对象对应的是数据库中的记录,属性则对应的是字段。此篇为章主要整理的是常用的字段类型和对应的参数。
# 自增长
id = models.AutoField(primary_key=True) # 系统会默认添加此字段,无需用户自己特地添加
id = models.BigAutoField()
自增长字段的意思是,数据表中每增加一条记录,这个字段的值就会自动加1。字段的类型默认为Int整型。下面的BigAutoField字段可容纳比较大的数,比如说十亿。但是需要注意的一点是,其实我们在定义数据库表结构的时候并不需要特地定义这样一个字段,因为Django会在每个表中自动添加一个id字段,且这个字段的类型正是自增长型。
# 二进制
Binary = models.BinaryField()
在某些特殊情况下,我们可以用此字段类型来插入二进制数据。
# 布尔型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()
Django提供了两种布尔类型的字段,上面这种不能为空,下面这种的字段值可以为空。
# 整型
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)具体分类如上。
# 字符串类型
Char = models.CharField() # varchar
Text = models.TextField() # longtext
字符串类型的字段分为两种,上面这种对应数据库中的varchar,需要在参数max_length中指定字符串的大小。下面这种对应数据库中的longtext类型,无需指定字符串长度,想写多长就写多长。
# 时间日期类型
Date = models.DateField()
DateTime = models.DateTimeField()
Duration = models.DurationField() # int, Python timedelta实现
时间类型分为三种,Date是年月日的形式,DateTime是年月日时分秒的形式,第三种表示一段时间,在数据表中是Int类型,它的底层是通过python的timedelta实现的。
# 浮点型
Float = models.FloatField()
Decimal = models.DecimalField() # 11.22, 16.34
浮点型也有两种,其中第二种Decimal比较特殊,需要在参数中指定整数有多少位,小数有多少位。
# 其它字段
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)
前面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字段的参数分如下三种情况:
on_delelte= 这个参数表示外键所关联的对象被删除的时候要进行什么操作,比如说一篇文章对应一个Python的分类,但是这个分类被你不小心删除了,那么这篇文章的分类应该会发生什么变化呢?主要有以下六种:
需要在第一个参数中添加‘self’字符串,或写上它自己的表名(模型类名)。