Django ORM models中的字段及参数详解

1,470 阅读5分钟

一. models中所有字段

  • AutoField(Field)

    int自增列,必须填入参数 primary_key=True
    
  • BigAutoField(AutoField)

    bigint自增列,必须填入参数 primary_key=True
    

如果某张表中没有设定自增列,models会默认创建一个名为 id 的列

  • SmallIntegerField(IntegerField)

    小整数 -32768 ~ 32767
    
  • PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)

    - 正小整数 0 ~ 32767
    
  • IntegerField(Field)

    整数列(有符号的) -2147483648 ~ 2147483647
    
  • PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField

    正整数 0 ~ 2147483647
    
  • BigIntegerField(IntegerField)

    长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    
  • DurationField(Field)

    长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    
  • FloatField(Field)

    浮点型,与 python 里的 float 实例相同
    
  • DecimalField(Field)

    - 10进制小数
      - 参数:
          max_digits,小数总长度
          decimal_places,小数位长度
    
  • BinaryField(Field)

    二进制类型,不能使用 filter 函数获得 QuerySet
    
  • BooleanField(Field)

    布尔值类型(True/False),默认为None
    
  • NullBooleanField(Field)

    可以为空的布尔值
    
  • CharField(Field)

    字符类型, 必须提供 max_length 参数, max_length表示字符长度
    
  • TextField(Field)

    大文本,巨长的文本
    注意:
        如果使用 MySQLdb 1.2.1p2 和 utf-8_bin 编码,会有一些问题https://docs.djangoproject.com/en/dev/ref/databases/#mysql-collation
    
  • EmailField(CharField)

    字符串类型,Django Admin以及ModelForm中提供验证机制,在 CharField 基础上附加了 邮件地址合法性验证
    
  • IPAddressField(Field)

    字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
    
  • GenericIPAddressField(Field)

    - 字符串类型,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"
    
  • URLField(CharField)

    字符串类型,Django Admin以及ModelForm中提供验证 URL
    
  • SlugField(CharField)

    字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
    
  • CommaSeparatedIntegerField(CharField)

    字符串类型,格式必须为逗号分割的数字
    
  • UUIDField(Field)

    字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
    
  • FilePathField(Field)

    - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
      - 参数:
              path                      文件夹路径
              match=None                正则匹配
              recursive=False           递归下面的文件夹
              allow_files=True          允许文件
              allow_folders=False       允许文件夹
    
  • FileField(Field)

    - 字符串,路径保存在数据库,文件上传到指定目录
     不支持 primary_key 和 unique 选项, 否则会报 TypeError 异常
      - 参数:
          upload_to = ""      上传文件的保存路径
          storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
    - 注意:
    必须设置 FileField.upload_to 选项,这个是 本地文件系统路径,附加在 MEDIA_ROOT 设置的后边,也就是 MEDIA_ROOT 下的子目录相对路径
    使用 FileField 和 ImageField 需要以下步骤:
        (1)修改 settting.py,设置 MEDIA_ROOT(使用绝对路径),指定用户上传的文件保存在哪里。设置 MEDIA_URL,作为 web地址 前缀,要保证 MEDIA_ROOT 目录对运行 Django 的用户是可写的;
        (2)在 model 中增加 FileField 或 ImageField,并指定 upload_to 选项指定存在 MEDIA_ROOT 的哪个子目录里; 
        (3)存在数据库里的是什么东西呢?是 File 或 Image相对于 MEDIA_ROOT 的相对路径,你可以在 Django 里方便的使用这个地址,比如你的 ImageField 叫 tupian,你可以在 template 中用{{object.tupian.url}}。
    
  • ImageField(FileField)

    - 字符串,路径保存在数据库,文件上传到指定目录
      - 参数:
          upload_to = ""      上传文件的保存路径
          storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
          width_field=None,   上传图片的高度保存的数据库字段名(字符串)
          height_field=None   上传图片的宽度保存的数据库字段名(字符串)
    
  • DateTimeField(DateField)

    日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    常用附加选项:
         DateField.auto_now: 每次执行 save 操作的时候自动记录当前时间,常作为最近一次修改的时间   使用。注意:总是在执行save 操作的时候执行,无法覆盖。
         DateField.auto_now_add: 第一次创建的时候添加当前时间。常作为 创建时间 使用。注意:每次create 都会调用
    
  • DateField(DateTimeCheckMixin, Field)

    日期格式      YYYY-MM-DD
    常用附加选项与DateTimeField相同
    
  • TimeField(DateTimeCheckMixin, Field)

    时间格式      HH:MM[:ss[.uuuuuu]]
    

二. 常用的字段

字符串类型:

EmailField(CharField)
IPAddressField(Field)
URLField(CharField)
SlugField(CharField)
UUIDField(Field)
FilePathField(Field)
FileField(Field)
ImageField(FileField)
CommaSeparatedIntegerField(CharField)

时间类型

DateTimeField(null=True)

数字类型

IntegerField()
FloatField()
DecimalField(max_digits=30,decimal_places=10)  #精确的小数类型

枚举

应用于固定的,不会修改的,例如:性别, 颜色, 会员等级等...

color_list = (
            (1,'黑色'),
            (2,'白色'),
            (3,'蓝色')
        )
color = models.IntegerField(choices=color_list)
     
1. 自己操作:
    自己取,自己用
2. 给Django admin使用
             
应用场景:
     选项固定
*PS: 外键应用于经常发生变动的选项!FK选项动态

三. Django ORM中models字段的参数

  1. 字段的参数
null=True
# boolean 值,缺省设置为false。通常不将其用于字符型字段上,比如CharField,TextField上。字符型字段如果没有值会返回空字符串。
default='tt'
# 给当前字段设定的缺省值,可以是一个具体值,也可以是一个可调用的对象,如果是可调用的对象将每次产生一个新的对象
db_index=True
# boolean 值,如果为True将为此字段创建索引
db_column
# string 值,指定当前列在数据库中的名字,不设置,将自动采用model字段名
unique=True
# boolean值,数据是否进行唯一性验证
max_length=xxx 
# 表示字符最大长度
primary_key= True 
# 设置主键,如果没有设置django创建表时会自动加上:id = meta.AutoField(‘ID’, primary_key=True)
         
class Meta:  # 用于创建多列间的组合操作
     # unique_together = ( #创建有关联的联合唯一索引
     #     ('email','ctime'),
     # )
     # index_together = (  #创建普通的索引
     #     ('email','ctime'),
     # )
  1. DjangoAdmin提供的参数
verbose_name        # Admin中显示的字段名称
blank               # Admin中是否允许用户输入为空
editable            # Admin中是否可以编辑
help_text           # Admin中该字段的提示信息
choices             # Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                    # 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
 
error_messages      # 自定义错误信息(字典类型),从而定制想要显示的错误信息;
                    # 可覆盖的key 有 null, blank, invalid, invalid_choice, 和 unique。

 
validators          
# 有效性检查。无效则抛出 django.core.validators.ValidationError 异常
# 自定义错误验证(列表类型),从而定制想要的验证规则

部分内容来自互联网

                            ~ Over 人生苦短,我用Python MM~