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(面试)

  • 提示: 一般作为DateFieldDateTimeField参数
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.自定义字段

  • DjangoCharField字段类型对应的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
分享
二维码
海报
Django ORM常用字段介绍与创建第三张表
一.常用字段类型表 常用字段 描述 与MySQL字段对应关系 AutoField 必须指定参数primary_key=True指定主键. 如果没有设置主键, 默认创建并以id名作为主……
<<上一篇
下一篇>>