Django丨模版层 - 2. 字段详解

1. 字段详解

<1> AutoField

1
class AutoField(**options)
  • 字段解释:一个自动增加的整数类型字段;你通常不需要直接使用这个字段
  • 用途:自定义一个主键:my_id = models.AutoField(primary_key=True);如果你不指定主键的话,系统会自动添加一个主键字段到你的model

<2> BigAutoField

1
class BigAutoField(**options)
  • 字段解释:64位整数类型自增字段,非常类似于AutoField,数字范围更大,从19223372036854775807

<3> SmallAutoField

1
class SmallAutoField(**options)
  • 字段解释:小自增字段,与AutoField相似。包含132767

<4> BinaryField

1
class BinaryField(max_length=None, **options)
  • 字段解释:一个用于存储原始二进制数据的字段。可以为其分配字节,字节数组或内存视图。
  • 用途:使用受限,少用。

<5> BooleanField

1
class BooleanField(**options)
  • 字段解释:布尔值类型字段。默认值是None。在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField

<6> CharField

1
class CharField(max_length=None, **options)
  • 字段解释:字符串字段, 用于较短的字符串。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是input text。最常用的filed。

<7> TextField

1
class TextField(**options)
  • 字段解释:一个容量很大的文本字段。如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。
  • 用途:常用字段。

<8> CommaSeparatedIntegerField

  • 字段解释:用于存放逗号分隔的整数值. 类似CharField, 必须要有max_length参数.

<9> IntegerField

1
class IntegerField(**options)
  • 字段解释:整数类型,最常用的字段之一。取值范围-21474836482147483647
  • 用途:用于保存一个整数.

<10> BigIntegerField

1
class BigIntegerField(**options)
  • 字段解释:64位整数字段(看清楚,非自增),类似IntegerField-92233720368547758089223372036854775807。在Django的模板表单里体现为一个textinput标签。

<11> SmallIntegerField

1
class SmallIntegerField(**options)
  • 字段解释:小整数,类似于IntegerField。包含-3276832767。

<12> FloatField

1
class FloatField(**options)
  • 字段解释:浮点数类型。

  • 必须提供两个参数:

    • 参数

      • max_digits 总位数(不包括小数点和符号)

      • decimal_places 小数位数

      • 举例来说, 要保存最大值为999(小数点后保存2位),

      • 你要这样定义字段:models.FloatField(..., max_digits=5, decimal_places=2)


<13> DateField

1
class DateField(auto_now=False, auto_now_add=False, **options)
  • 字段解释:日期类型字段。一个Python中的datetime.date的实例。

  • 参数

    • auto_now_addauto_nowdefault这三个参数是互斥的,不能共存;

      • auto_now:每当对象被保存时将字段设为当前日期,常用于保存最后修改时间。

      • auto_now_add:每当对象被创建时,设为当前日期,常用于保存创建日期(注意,它是不可修改的)。

      • 设置上面两个参数就相当于给field添加了editable=Falseblank=True属性。

      • 如果想具有修改属性,请用default参数。

      • 例子:pub_time = models.DateField(auto_now_add=True),自动添加发布时间。


<14> DateTimeField

1
class DateTimeField(auto_now=False, auto_now_add=False, **options)
  • 字段解释:日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样。

<15> TimeField

1
class TimeField(auto_now=False, auto_now_add=False, **options)
  • 字段解释:时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒。

<16> DecimalField

1
class DecimalField(max_digits=None, decimal_places=None, **options)
  • 字段解释:固定精度的十进制小数。相当于Python的Decimal实例,必须提供两个指定的参数!
  • 参数
    • max_digits:最大的位数,必须大于或等于小数点位数(整数位 + 小数位);
    • decimal_places:小数点位数,精度;
    • 例子:储存最大不超过999,带有2位小数位精度的数,定义如下:models.DecimalField(..., max_digits=5, decimal_places=2)

<17> DurationField

1
class DurationField(**options)
  • 字段解释:持续时间类型。存储一定期间的时间长度。类似Python中的timedelta。在不同的数据库实现中有不同的表示方法。
  • 用途:常用于进行时间之间的加减运算。但是小心了,这里有坑,PostgreSQL等数据库之间有兼容性问题!

<18> EmailField

1
class EmailField(max_length=254, **options)
  • 字段解释:邮箱类型,默认max_length最大长度254位。
  • 用途:使用这个字段的好处是,可以使用DJango内置的EmailValidator进行邮箱地址合法性验证。

<19> FileField

1
class FileField(upload_to=None, max_length=100, **options)
  • 字段解释:上传文件字段(不能设置为主键)。默认情况下,该字段在HTML中表现为一个ClearableFileInput标签。在数据库内,我们实际保存的是一个字符串类型,默认最大长度100,可以通过max_length参数自定义。真实的文件是保存在服务器的文件系统内的。

  • 重要参数upload_to用于设置上传地址的目录和文件名。如下例所示:

    1
    2
    3
    4
    5
    6
    class MyModel(models.Model):
    # 文件被传至`MEDIA_ROOT/uploads`目录,MEDIA_ROOT由你在settings文件中设置
    upload = models.FileField(upload_to='uploads/')
    # 或者
    # 被传到`MEDIA_ROOT/uploads/2015/01/30`目录,增加了一个时间划分
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
  • Django很人性化地帮我们实现了根据日期生成目录的方式!

  • upload_to参数也可以接收一个回调函数,该函数返回具体的路径字符串,如下例:

    1
    2
    3
    4
    5
    6
    def user_directory_path(instance, filename):
    #文件上传到MEDIA_ROOT/user_<id>/<filename>目录中
    return 'user_{0}/{1}'.format(instance.user.id, filename)

    class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

例子中,user_directory_path 这种回调函数,必须接收两个参数,然后返回一个Unix风格的路径字符串。参数instace代表一个定义了FileField的模型的实例,说白了就是当前数据记录。filename是原本的文件名。
更多用途查找官方文档


<20> FilePathField

1
class FilePathField(path=None, match=None, recursive=False, max_length=100, **options)
  • 字段解释:文件路径类型,是一个CharField。其选择仅限于文件系统上某个目录中的文件名。

  • 参数

    • path:必要参数,目录的绝对文件系统路径;例如:/home/images/;

    • path 也可以是可调用的,例如在运行时动态设置路径的函数。例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      import os
      from django.conf import settings
      from django.db import models

      def images_path():
      return os.path.join(settings.LOCAL_FILE_DIR, 'images')

      class MyModel(models.Model):
      file = models.FilePathField(path=images_path)
    • match:可选的。将用于过滤文件名的正则表达式(作为字符串)。请注意,正则表达式将应用于基本文件名,而不是完整路径。例如:foo.*\.txt$,它将与名为foo23.txt的文件匹配,但与bar.txtfoo23.png的文件不匹配。

    • recursive:可选参数,只能是True或者False。默认值为False。指定是否应包含路径的所有子目录,也就是是否递归的意思。

    • allow_files:可选参数,只能是True或者False。默认为True。决定是否应该将文件名包括在内。它和allow_folders其中,必须有一个为True

    • allow_folders: 可选参数,只能是True或者False。默认为False。决定是否应该将目录名包括在内。


<21> ImageField

1
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
  • 字段解释:从FileField继承所有属性和方法,不过要校验上传对象是否是一个合法图片。

  • 参数

    • height_field:保存有图片高度信息的模型字段名;
    • width_field:保存有图片宽度信息的模型字段名;
    • max_length: 最大长度;
  • ImageField实例在数据库中创建为varchar列,默认最大长度为100个字符。与其他字段一样,您可以使用max_length参数更改最大长度。

  • 使用 Django的 ImageField 需要提前安装pillow模块,pip install pillow即可。

  • 使用FileField或者ImageField字段的步骤:

    1. settings文件中,配置MEDIA_ROOT,作为你上传文件在服务器中的基本路径(为了性能考虑,这些文件不会被储存在数据库中)。再配置个MEDIA_URL,作为公用URL,指向上传文件的基本路径。请确保Web服务器的用户账号对该目录具有写的权限。
    2. 添加FileField或者ImageField字段到你的模型中,定义好upload_to参数,文件最终会放在MEDIA_ROOT目录的upload_to子目录中。
    3. 所有真正被保存在数据库中的,只是指向你上传文件路径的字符串而已。可以通过url属性,在Django的模板中方便的访问这些文件。例如,假设你有一个ImageField字段,名叫mug_shot,那么在Django模板的HTML文件中,可以使用来获取该文件。其中的object用你具体的对象名称代替。
    4. 可以通过namesize属性,获取文件的名称和大小信息。
  • 安全建议:

    • 无论你如何保存上传的文件,一定要注意他们的内容和格式,避免安全漏洞!务必对所有的上传文件进行安全检查,确保它们不出问题!如果你不加任何检查就盲目的让任何人上传文件到你的服务器文档根目录内,比如上传了一个CGI或者PHP脚本,很可能就会被访问的用户执行,这具有致命的危害。

<22> GenericIPAddressField

1
class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)
  • 字段解释:IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4
  • 参数
    • protocol:默认值为both,可选IPv4,IPv6。匹配不区分大小写。
    • unpack_ipv4:解压缩IPv4映射的地址,如::ffff:192.0.2.1。如果启用此选项,则该地址将解压缩为192.0.2.1。默认设置为禁用。只能在协议设置为bothboth时使用。

<23> IPAddressField

  • 类似GenericIPAddressField字段
  • 字段解释:一个字符串形式的 IP 地址, (i.e. “24.124.1.30”)。

<24> NullBooleanField

1
class NullBooleanField(**options)
  • 字段解释:类似布尔字段,只不过额外允许NULL作为选项之一。
  • 用法:(三个可选择的值: Unknown, YesNo ) 来表示这种字段数据.
  • 不过后面django可能会放弃该字段,不推荐

<25> PositiveIntegerField

1
class PositiveIntegerField(**options)
  • 字段解释:正整数字段,类似于IntegerField,但必须为正数或零(0)。包含02147483647

<26> PositiveSmallIntegerField

1
class PositiveSmallIntegerField(**options)
  • 字段解释:较小的正整数字段,类似于PositiveIntegerField,从032767

<27> SlugField

1
class SlugField(max_length=50, **options)
  • 字段解释slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs中。
  • 参数
    • max_length:最大长度,默认值为50

<28> URLField

1
class URLField(max_length=200, **options)
  • 字段解释:一个用于保存URL地址的字符串类型。给定的 URL 会预先检查是否存在( 即URL是否被有效装入且没有返回404响应)。
  • 参数
    • max_length:最大长度,默认值为200

<29> UUIDField

1
class UUIDField(**options)
  • 字段解释:用于存储通用唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它存储在uuid数据类型中,否则存储在char(32)中。
  • 用途:通用唯一标识符是primary_key的自增字段的很好替代。数据库不会为您生成UUID,因此建议使用default:
  • 例如:
    1
    2
    3
    4
    5
    6
    import uuid  # Python的内置模块
    from django.db import models

    class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 其他字段

2. 字段参数

2.1 null

  • 如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是False.

2.2 blank

  • 如果为True,该字段允许不填。默认为False
  • 要注意,这与null不同。null纯粹是数据库范畴的,而blank是数据验证范畴的。
  • 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

2.3 default

  • 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

2.4 primary_key

  • 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  • Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  • 否则没必要设置任何一个字段的primary_key=True

2.5 unique

  • 如果该值设置为True, 这个数据字段的值在整张表中必须是唯一的

2.6 choices

  • 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,
  • 而且这个选择框的选项就是choices中的选项。