Django ORM常用字段介绍与创建第三张表
一.常用字段类型表
常用字段 | 描述 | 与MySQL字段对应关系 |
---|---|---|
AutoField | 必须指定参数primary_key=True指定主键. 如果没有设置主键, 默认创建并以id名作为主键 | integer auto_increment |
IntegerField | 整型字段. 存储宽度4Bytes. 无符号: 0~2^32 有符号: -232/2~232-1 | int 或 integer |
BigIntegerField | 整型字段. 存储宽度8Bytes. 无符号: 0~2^64 有符号: -264/2~264-1 | bigint |
DeciamlField | 浮点字段. 必须指定参数max_digits设置总长度. decimal_places设置小数位长度 | numeric(%(max_digits)s, %(decimal_places)s) |
EmailField | 字符字段. Django Admin以及ModelForm中提供验证机制 | |
CharField | 字符字段. 必须指定参数max_length参数设置字符存储个数. Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段. | varchar(%(max_length)s) |
DateField | 日期字段. 格式: 年-月-日. 一般指定参数auto_now=Ture更新记录的时间, 或者auto_now_add=True插入记录的时间 | date |
DateTimeField | 日期字段. 格式: 年-月-日 时:分:秒 一般指定参数auto_now=Ture更新记录的时间, 或者auto_now_add=True插入记录的时间 | datetime |
二、常用于非常用字段类型合集(联想记忆:与MySQL字段对应关系)
1.自增长字段
- 注:当model如果没有自增列,则自动会创建一个列名为id的列(主键)
models.AutoField(primary_key=True) # 必须填入参数 primary_key=True
models.BigAutoField(primary_key=True) # 必须填入参数 primary_key=True
# 与MySQL字段对应关系
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
2.整形字段
- 常用
IntegerField() # 整数列(有符号) -2147483648 ~ 2147483647
BigIntegerField() # 长整型(有符号) -9223372036854775808 ~ 9223372036854775807
# 对应mysql字段对应关系
IntegerField----->int
BigIntegerField----->bigint
- 不常用
PositiveSmallIntegerField() # 正小整数 0 ~ 32767
PositiveIntegerField() # 正整数 0 ~ 2147483647
SmallIntegerField() # 小整数 -32768 ~ 32767
# 对应mysql字段对应关系
PositiveSmallIntegerField----->samllint unsigned
PositiveIntegerField----->int unsigned
SmallIntegerField----->smallint
3.布尔类型
BooleanField() # 布尔值类型
NullBooleanField() # 可以为空的布尔值
# 对应mysql字段对应关系
BooleanField----->bool # mysql 中只提供了一种bool类型
4.字符串类型
- 常用
CharField() # 必须提供max_length参数, max_length表示字符长度
TextField() # 文本类型, 该字段可以用来存大段内容(文章、评论等), 没有字数限制
# 对应mysql字段对应关系
CharField----->varchar(length)
TextField----->longtext
- 邮箱类型
EmailField() # Django Admin以及ModelForm中提供验证机制
# mysql以varchar(254)形式存储
- IP地址
IPAddressField() # Django Admin以及ModelForm中提供验证 IPV4 机制
GenericIPAddressField() # Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
# 参数
protocol # 用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4 # 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
# mysql中分别用char(15)与char(39)形式存储
- URL
URLField() # Django Admin以及ModelForm中提供验证 URL
- 文件 类型
FileField() # 传入一个文件对象,保存在指定路径下,然后将路径保存在数据库中
# 参数
upload_to = "" # 上传文件的保存路径
storage = None # 存储组件,默认django.core.files.storage.FileSystemStorage
FilePathField() # Django Admin以及ModelForm中提供读取文件夹下文件的功能
# 参数
path # 文件夹路径
match=None # 正则匹配
recursive=False # 递归下面的文件夹
allow_files=True # 允许文件
allow_folders=False # 允许文件夹
# mysql中都使用varchar(length)
- 图片类型
ImageField() # 路径保存在数据库,文件上传到指定目录
# 参数
upload_to = "" # 上传文件的保存路径
storage = None # 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None # 上传图片的高度保存的数据库字段名(字符串)
height_field=None # 上传图片的宽度保存的数据库字段名(字符串)
- 其他类型
SlugField() # Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
CommaSeparatedIntegerField() # 格式必须为逗号分割的数字
UUIDField() # Django Admin以及ModelForm中提供对UUID格式的验证
# mysql中前两者都使用varchar(length), UUIDField对应char(32)
5.时间类型
DateField() # 日期格式, YYYY-MM-DD
TimeField() # 时间格式, HH:MM[:ss[.uuuuuu]]
DateTimeField() # 日期+时间格式, YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DurationField() # 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
# 对应mysql字段类型
DateField----->date
DateTimeField----->datetime
DurationField----->bigint
6.浮点型
FloatField() # 浮点数
DecimalField() # 10进制小数
#参数
max_digits # 小数总长度
decimal_places # 小数位长度
# 对应mysql字段类型
FloatField----->double precision
DecimalField----->numeric(max_digits,decimal_places)
7.二进制类型
BinaryField() # 二进制类型
# 对应mysql字段类型
BinaryField----->longlob
8.关系型字段
- ForeignKey : 一对多
# 一对多,外键字段推荐建在一对多中多的一方
publish = models.ForeignKey(to='Publish)
- ManyToManyField : 多对多
# 建议外键字段推荐建在查询频率较高的一方,且无需手动创建中间表,models会自动帮你创建一张虚拟表
authors = models.ManToManyField(to='authors')
- OneToOneField : 一对一
# 建议外键字段建立在查询频率较高的一方
author_detail = models.OneToOneField(to='AuthorDetail')
ps : 建立一对多、一对一关系的外键关联表, 关联表中默认会在建立的外键字段之后拼接"_id", 也就是 我们无需自己手动写个后缀
三、字段参数
1.通用字段参数
- 所有字段类型都具备的参数
# 更改字段名
db_colum=''
# 设置主键
primary_key=True,默认为False
# 给字段设置别名(备注)
verbose_name=''
# 为字段设置默认值
default
# 字段的唯一键属性
unique=True,设置之后,这个字段的没一条记录的每个值是唯一的
# 允许字段为空
null=True(数据库中字段可以为空),blank=True(网页表单提交内容可以为空),切记不可以将null设置为Fasle的同时还把blank设置为True。会报错的。
# 给字段建立索引
db_index=True
# 在表单中显示说明
help_text=''
# 字段值不允许更改
editable=False,默认是True,可以更改。
2.个别字段才有的参数
CharField(max_length=100)
字段长度为utf8编码的100个字符串
DateField(unique_for_date=True)
这个字段的时间必须唯一
DecimalField(max_digits=4, decimal_places=2)
前者表示整数和小数总共多少数,后者表示小数点的位数
3.auto_now和auto_now_add(面试)
- 提示: 一般作为
DateField
和DateTimeField
参数
auto_now=True
对这条记录内容更新的时间
auto_now_add=True
插入这条记录的时间
4.关系型字段的参数
- ForeignKey : 一对多
# to
设置要关联的表
unique=True
ForeignKey(unique=True) === OneToOneField()
# 你在用前面字段创建一对一 orm会有一个提示信息 orm推荐你使用后者但是前者也能用
# to_field
置要关联的表的字段 默认不写关联的就是另外一张的主键字段.
# on_delete=models.CASECADE 和 on_update=models.CASECADE
设置级联更新级联删除. 同等与SQL语言中的ON DELETE CASCADE等约束 (提示: 该操作为Django1.X版本的默认操作, 2.X和3.X需要手动指定)
# db_index
如果db_index=True 则代表着为此字段设置索引
# db_constraint:
注意:db_constraint参数只适用于一对一, 或者一对多的关系. 至于多对多也是由双向的一对多关系组合而成, 是在一对多的关系上使用
是否在数据库中创建外键约束,默认为True,可以设置为False
好处是不会出现脏数据
坏处是插入的时候,效率低
企业通常不建立,由程序员来控制
只提供约束,基于对象和连表查询还是照样查
关联字段与外键约束没有必然的联系(建管理字段是为了进行查询,建约束是为了不出现脏数据)
其余字段的参数
models.DO_NOTHING
删除关联数据,引发错误IntegrityError
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
# on_dalete实际应用
on_delete参数:
1、表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段)
2、断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(不影响增删改查操作)
3、断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,代码控制
4、断关联
5、级联关系
作者没了,详情也没:on_delete=models.CASCADE
出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
部门没了,员工没有部门(空不能):null=True, on_delete=models.SET_NULL
部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
- OneToOneField : 一对一
to
# 设置要关联的表
to_field
# 设置要关联的表的字段
on_delete
# 同ForeignKey字段
- ManyToManyField : 多对多
to
# 设置要关联的表
to_field
# 设置要关联的表的字段
related_query_name
# 反向查询操作时,使用的连接前缀,用于替换表名
symmetrical
# 仅用于多对多自关联时,指定内部是否创建反向操作的字段, 默认为True
through
# 手动创建第三张表,指定通过哪个表
through_fields
# 设置关联的字段
db_table
# 默认创建第三张表时,数据库中表的名称
5.自关联字段参数
需要在第一个参数中添加‘self’字符串,或写上它自己的表名(模型类名)
parent = ForeignKey(to='self')
6. related_name 和 related_query_name
related_name
# related_name 子查询反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
# 例如:
class Classes(models.Model):
name = models.CharField(max_length=32)
class Student(models.Model):
name = models.CharField(max_length=32)
theclass = models.ForeignKey(to="Classes")
# 当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().student_set.all()
# 当我们在ForeignKey字段中添加了参数 related_name 后
class Student(models.Model):
name = models.CharField(max_length=32)
theclass = models.ForeignKey(to="Classes", related_name="students")
# 当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().students.all()
related_query_name
# related_query_name连表查询时, 反向查询操作时,使用的连接前缀,用于替换表
四、自定义字段及使用
1.自定义字段
-
在
Django
中CharField字段类型对应的mysql中默认就是varchar类型,如果想让Django支持Char类型,那么我们可以重写一个类来支持Char字段 -
在pycharm中先Ctrl+点击 CharField 字段查看其源码,按照它的模板改写
class MyCharField(models.Field):
# 1. 自定义独有参数
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super().__init__(max_length=max_length, *args, **kwargs) # max_length一定要是关键字的形式传入
# 2. 定义存储的类型及约束条件
def db_type(self, connection):
return 'Char(%s)' % self.max_length
2.自定义字段的使用
class Text(models.Model):
myfield = MyCharField(max_length=32, null=True)
五、手动创建第三张表
1.自动创建(常用)
- 优点 : 第三张表以及对应的外键关联字段不需要书写
- 缺点 : 可扩展性差, 无法对ORM自动生成的中间表进行增加字段的操作
- 注意 : 可以使用ORM提供给多对多关系表操作API以及正方向和双下划线查询
- 第三张表中没有其他字段
class Author(models.Model):
name = models.CharField(max_length=32,verbose_name='作者名')
# 通过ORM自带的ManyToManyField自动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name='书名')
authors = models.ManyToManyField(to='Author',related_name='authors')
2.全手动创建(基本不用)
- 优点:可扩展性强, 第三张表的内容完全取决于自己
- 缺点:ORM提供给多对多关系表之间的API以及正反向和双下划线查询都不支持, 并且代码也会多一些
class Author(models.Model):
name = CharField(max_legth=32,verbose_name='作者名')
class Book(models.Model):
title = CharField(max_length=32,verbose_name='书名')
class BookAuthor(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
3.半手动创建(比较常用)
- 优点:既可以对第三张表进行字段的添加, 也能使用ORM提供的正反向和双下划线查询
- 缺点 : 无法使用ORM提供的多对多表关系之间的API (add, set, remove, clear)
class Author(models.Model):
name = models.CharField(max_length=32,verbose_name='作者名')
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name='书名')
authors = models.ManyToManyField(
to='Author', # 建立多对多关系的表,to_field参数可以不指定默认是主键
through='BookAuthor', # 第三张表名
through_fields=('book','author'))
# 第三张表中对应需要关联两张表的字段,以元组形式传
# 顺序:外键字段在哪张表,该表就排在前面
class BookAuthor(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
版权声明:
作者:淘小欣
链接:https://blog.taoxiaoxin.club/151.html
来源:淘小欣的博客
文章版权归作者所有,未经允许请勿转载。
THE END
0
二维码
海报
Django ORM常用字段介绍与创建第三张表
一.常用字段类型表
常用字段
描述
与MySQL字段对应关系
AutoField
必须指定参数primary_key=True指定主键. 如果没有设置主键, 默认创建并以id名作为主……

共有 0 条评论