1. 字段详解
<1> AutoField
1
| class AutoField(**options)
|
- 字段解释:一个自动增加的整数类型字段;你通常不需要直接使用这个字段
- 用途:自定义一个主键:
my_id = models.AutoField(primary_key=True)
;如果你不指定主键的话,系统会自动添加一个主键字段到你的model
;
<2> BigAutoField
1
| class BigAutoField(**options)
|
- 字段解释:64位整数类型自增字段,非常类似于
AutoField
,数字范围更大,从1
到9223372036854775807
<3> SmallAutoField
1
| class SmallAutoField(**options)
|
- 字段解释:小自增字段,与
AutoField
相似。包含1
到32767
。
<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)
|
- 字段解释:整数类型,最常用的字段之一。取值范围
-2147483648
到2147483647
。
- 用途:用于保存一个整数.
<10> BigIntegerField
1
| class BigIntegerField(**options)
|
- 字段解释:64位整数字段(看清楚,非自增),类似
IntegerField
,-9223372036854775808
到9223372036854775807
。在Django的模板表单里体现为一个textinput
标签。
<11> SmallIntegerField
1
| class SmallIntegerField(**options)
|
- 字段解释:小整数,类似于
IntegerField
。包含-32768
到32767。
<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)
|
<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): upload = models.FileField(upload_to='uploads/') upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
|
Django很人性化地帮我们实现了根据日期生成目录的方式!
upload_to
参数也可以接收一个回调函数,该函数返回具体的路径字符串,如下例:
1 2 3 4 5 6
| def user_directory_path(instance, 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)
|
<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
字段的步骤:
- 在
settings
文件中,配置MEDIA_ROOT
,作为你上传文件在服务器中的基本路径(为了性能考虑,这些文件不会被储存在数据库中)。再配置个MEDIA_URL
,作为公用URL
,指向上传文件的基本路径。请确保Web服务器的用户账号对该目录具有写的权限。
- 添加
FileField
或者ImageField
字段到你的模型中,定义好upload_to
参数,文件最终会放在MEDIA_ROOT
目录的upload_to
子目录中。
- 所有真正被保存在数据库中的,只是指向你上传文件路径的字符串而已。可以通过
url
属性,在Django的模板中方便的访问这些文件。例如,假设你有一个ImageField
字段,名叫mug_shot
,那么在Django模板的HTML文件中,可以使用
来获取该文件。其中的object
用你具体的对象名称代替。
- 可以通过
name
和size
属性,获取文件的名称和大小信息。
安全建议:
- 无论你如何保存上传的文件,一定要注意他们的内容和格式,避免安全漏洞!务必对所有的上传文件进行安全检查,确保它们不出问题!如果你不加任何检查就盲目的让任何人上传文件到你的服务器文档根目录内,比如上传了一个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
。默认设置为禁用。只能在协议设置为both
和both
时使用。
<23> IPAddressField
- 类似
GenericIPAddressField
字段
- 字段解释:一个字符串形式的
IP
地址, (i.e. “24.124.1.30”)。
<24> NullBooleanField
1
| class NullBooleanField(**options)
|
- 字段解释:类似布尔字段,只不过额外允许NULL作为选项之一。
- 用法:(三个可选择的值:
Unknown
, Yes
和 No
) 来表示这种字段数据.
- 不过后面django可能会放弃该字段,不推荐
<25> PositiveIntegerField
1
| class PositiveIntegerField(**options)
|
- 字段解释:正整数字段,类似于
IntegerField
,但必须为正数或零(0)。包含0
到2147483647
。
<26> PositiveSmallIntegerField
1
| class PositiveSmallIntegerField(**options)
|
- 字段解释:较小的正整数字段,类似于
PositiveIntegerField
,从0
到32767
。
<27> SlugField
1
| class SlugField(max_length=50, **options)
|
- 字段解释:
slug
是一个新闻行业的术语。一个slug
就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs
中。
- 参数:
<28> URLField
1
| class URLField(max_length=200, **options)
|
- 字段解释:一个用于保存URL地址的字符串类型。给定的 URL 会预先检查是否存在( 即URL是否被有效装入且没有返回404响应)。
- 参数:
<29> UUIDField
1
| class UUIDField(**options)
|
- 字段解释:用于存储通用唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它存储在uuid数据类型中,否则存储在char(32)中。
- 用途:通用唯一标识符是primary_key的自增字段的很好替代。数据库不会为您生成UUID,因此建议使用default:
- 例如:
1 2 3 4 5 6
| import uuid 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
中的选项。