本文档包含了Django提供的字段
的全部API参考,包括字段选项 和 字段类型。
注
技术上来说, 这些模型定义于 django.db.models.fields
, 但为了方便起见它们被导入到django.db.models
; 标准惯例是用 from django.db import models
,涉及到字段时用 models.<Foo>Field
.
下列参数是全部字段类型都可用的, 而且都是可选择的。
null
¶Field.
null
¶如果为True
,Django将在数据库中将空值存储为NULL
。 默认值是 False
。
避免在基于字符串的字段(例如CharField
和TextField
上使用null
。 如果字符串字段的null=True
,那意味着对于“无数据”有两个可能的值:NULL
和空字符串。 在大多数情况下,对于“无数据”声明两个值是赘余的,Django 的惯例是使用空字符串而不是NULL
。 一个例外是当CharField
同时具有unique=True
和blank=True
时。 在这种情况下,需要null=True
,以便在使用空白值保存多个对象时避免唯一的约束违规。
无论是字符串字段还是非字符串字段,如果你希望在表单中允许空值,你将还需要设置blank=True
,因为null
仅仅影响数据库存储(参见blank
)。
注
在使用Oracle 数据库时,数据库将存储NULL
来表示空字符串,而与这个属性无关。
如果你希望BooleanField
接受null
值,请用 NullBooleanField
代替。
blank
¶Field.
blank
¶如果为True
,则该字段允许为空白。 默认值是 False
。
注意它与null
不同。 null
纯粹是数据库范畴的概念,而blank
是数据验证范畴的。 如果字段设置blank=True
,表单验证时将允许输入空值。
如果字段设置blank=False
,则该字段为必填。
choices
¶Field.
choices
¶它是一个可迭代的结构(比如,列表或是元组),由可迭代的二元组组成(比如[(A, B), (A, B) ...]
),用来给这个字段提供选择项。 如果设置了 choices ,默认表格样式就会显示选择框,而不是标准的文本框,而且这个选择框的选项就是 choices 中的元组。
每个元组中的第一个元素,是存储在数据库中的值;第二个元素是使人容易理解的描述。 比如:
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
)
一般来说,最好在模型类内部定义choices,然后再给每个值定义一个合适名字的常量。
from django.db import models
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = (
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
)
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in (self.JUNIOR, self.SENIOR)
尽管你可以在模型类的外部定义choices然后引用它,但是在模型类中定义choices和其每个choice的name(即元组的第二个元素)可以保留所有使用该choices的类的信息, 也使得choices更容易被引用(例如, Student.SOPHOMORE
可以在任何引入Student
模型的位置生效)。
你也可以归类可选的choices到已命名的组中用来达成组织整理的目的:
MEDIA_CHOICES = (
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
)
每个元组的第一个元素是组的名字。 第二个元素是一组可迭代的二元元组,每个二元元组包含一个值和一个易读的名字,构成一个选项。 已分组的选项可能会和未分组的选项合在同一个list中。 (就像例中的unknown选项)。
对于有choices
属性的模型字段, Django 将会加入一个方法来获取当前字段值的易于理解的名称 参见数据库API文档中的get_FOO_display()
。
请注意choices可以是任何可迭代的对象 – 不是必须是列表或者元组。
这一点使你可以动态的构建choices。 但是如果你发现你自己搞不定动态的choices
,你最好还是使用ForeignKey
来构建一个合适的数据库表。 如果是这样,choices
更适合那些变动不多的静态数据。
除非blank=False
和default
一起在字段中被设置,否则,可选择菜单将会有"---------"
的标签。 要重写这个行为, 需要加入一个包含None
的元组到 choices
里面; 例如 (None, 'Your String For Display')
.
或者, 在可行的情况下用一个空字符串代替None
- 比如在一个 字符串字段
.
db_column
¶Field.
db_column
¶数据库中用来表示该字段的列名称。 如果未指定,那么Django将会使用字段名作为列名.
如果您的数据库列名称是SQL保留字,或包含Python变量名称中不允许的字符,特别是连字符,那也没关系。 Django在幕后引用列和表名。
db_tablespace
¶Field.
db_tablespace
¶如果该字段有索引的话,数据库database tablespace的名称将作为该字段的索引名。 如果DEFAULT_INDEX_TABLESPACE
已经设置,则默认值是由DEFAULT_INDEX_TABLESPACE指定, 如果没有设置则由 db_tablespace
指定, 如果后台数据库不支持索引的tablespaces,则该选项被忽略
default
¶Field.
default
¶该字段的默认值. 它可以是一个值或者一个可调用对象. 如果是一个可调用对象,那么在每一次创建新对象的时候,它将会调用一次.
默认值不能是可变对象(模型实例list
,set
等。),因为对该对象的同一实例的引用将被用作所有新模型实例中的默认值。 或者,把他们包装为一个可调用的对象。 例如,如果要为JSONField
指定默认dict
,请使用以下函数:
def contact_default():
return {"email": "[email protected]"}
contact_info = JSONField("ContactInfo", default=contact_default)
匿名函数
不能用于类似default
的字段选项,因为它们不能serialized by migrations. 请参见文档其他部分。
对于映射到模型实例的ForeignKey
等字段,默认值应该是它们引用的字段的值(pk
,除非设置了to_field
),而不是模型实例。
默认值会在新实例创建并且没有给该字段提供值时使用。 如果字段为主键,默认值也会在设置为None
时使用。
error_messages
¶Field.
error_messages
¶error_messages
参数能够让你重写抛出的默认错误信息。 通过关键字,在字典中匹配你要重写的错误信息。
error_messages 的 key 值包括 unique
, unique_for_date
, invalid
, blank
, null
, 和 invalid_choice
. 其余的 error_messages 的 keys 在不同的章节下 Field types是不一样的。
这些错误消息通常不会传播到表单。 参见Considerations regarding model’s error_messages。
help_text
¶Field.
help_text
¶额外的 ‘help' 文本将被显示在表单控件form中。 即便你的字段没有应用到一个form里面,这样的操作对文档化也很有帮助。
注意在自动生成的表单中,这个值不会进行HTML转义。 如果真的需要,应该在help_text
中包含HTML。 例如:
help_text="Please use the following format: <em>YYYY-MM-DD</em>."
另外, 你可以使用简单文本和django.utils.html.escape()
以避免任何HTML特定的字符. 请确保你所使用的help text能够避免那些由不受信任的用户进行的跨站点脚本攻击。
primary_key
¶Field.
primary_key
¶若为 True
, 则该字段会成为模型的主键字段。
如果你没有在模型的任何字段上指定 primary_key=True
, Django会自动添加一个 AutoField
字段来充当主键。 所以除非你想要覆盖默认的主键行为,否则不需要在任何字段上设定primary_key=True
。 更多内容 请参考 Automatic primary key fields.
primary_key=True
暗含着null=False
和unique=True
. 一个对象上只能拥有一个主键.
主键字段是只读的。 如果你改变了一个已存在对象上的主键并且保存的话,会创建一个新的对象,而不是覆盖旧的.
unique
¶Field.
unique
¶如果为 True
, 这个字段在表中必须有唯一值.
这是一个在数据库级别的强制性动作,并且通过模型来验证。 如果你试图用一个重复的值来保存unique
字段,那么一个django.db.IntegrityError
就会通过模型的save()
函数抛出来。
此选项对除ManyToManyField
和OneToOneField
之外的所有字段类型均有效。
注意当设置unique
为True
时,你不需要再指定 db_index
,因为unique
本身就意味着一个索引的创建。
在旧版本中,unique=True
不能用于FileField
。
unique_for_date
¶Field.
unique_for_date
¶当设置它为DateField
和DateTimeField
字段的名称时,表示要求该字段对于相应的日期字段值是唯一的。
例如,你有一个title
字段设置unique_for_date="pub_date"
,那么Django 将不允许两个记录具有相同的title
和pub_date
。
注意,如果你将它设置为DateTimeField
,只会考虑其日期部分。 此外,如果USE_TZ
为True
,检查将以对象保存时的current time zone 进行。
这是在模型验证期间通过Model.validate_unique()
强制执行的,而不是在数据库层级进行验证。 如果unique_for_date
约束涉及的字段不是ModelForm
中的字段(例如,exclude
中列出的字段或者设置了editable=False
),Model.validate_unique()
将忽略该特殊的约束。
validators
¶Field.
validators
¶该字段将要运行的一个Validator 的列表。 更多信息参见validators documentation。
Field
实现了lookup registration API。
该API 可以用于自定义一个字段类型的可用的查询,以及如何从一个字段获取查询。
AutoField
¶一个根据实际ID自动增长的IntegerField
. 你通常不需要直接使用它;如果没有另外指定,主键字段将自动添加到您的模型中。 详细查看 Automatic primary key fields.
BigIntegerField
¶一个64位整数,非常像IntegerField
,除了它保证适合从-9223372036854775808
到9223372036854775807
的数字。 这个字段默认的表单组件是一个TextInput
.
BinaryField
¶这是一个用来存储原始二进制码的Field. 只支持bytes
赋值, 注意这个Field只有很有限的功能。 例如,不大可能在一个BinaryField
值的数据上进行查询 在ModelForm
中也不可能包含BinaryField
。
滥用BinaryField
尽管你可能想使用数据库来存储你的文件,但是99%的情况下这都是不好的设计。 这个字段 不是替代static files 的合理操作.
BooleanField
¶true/false 字段。
此字段的默认表单挂件是一个CheckboxInput
.
如果你需要设置null
值,则使用NullBooleanField
来代替BooleanField。
如果Field.default
没有指定的话, BooleanField
的默认值是 None
。
CharField
¶一个用来存储从小到很大各种长度的字符串的地方
如果是巨大的文本类型, 可以用 TextField
.
这个字段默认的表单组件是一个TextInput
.
CharField
必须接收一个额外的参数:
CharField.
max_length
¶字段的最大字符长度. max_length将在数据库层和Django表单验证中起作用, 用来限定字段的长度.
注
如果你在写一个需要导出到多个不同数据库后端的应用,你需要注意某些后端对max_length
有一些限制, 查看database backend
notes来获取更多的细节
CommaSeparatedIntegerField
¶自1.9版以来已弃用 这个字段不利于CharField
与validators=[
validate_comma_separated_integer_list
]
。
一个逗号分隔的整数字段。 像 CharField
一样, 需要一个max_length
参数, 同时数据库移植时也需要注意。
DateField
¶这是一个使用Python的datetime.date
实例表示的日期. 有几个额外的设置参数:
DateField.
auto_now
¶每次保存对象时,自动设置该字段为当前时间。 用于"最后一次修改"的时间戳。 请注意,当前日期为始终使用;它不只是一个可以覆盖的默认值。
调用Model.save()
时,该字段才会自动更新。 当以其他方式更新其他字段(例如QuerySet.update()
)时,该字段不会更新,尽管您可以为此类型的更新指定字段的自定义值。
DateField.
auto_now_add
¶当对象第一次被创建时自动设置当前时间。 用于创建时间的时间戳. 请注意,始终使用当前日期;它是一个可以覆盖的默认值。 因此,即使您在创建对象时为此字段设置了一个值,也将被忽略。
如果您想要修改此字段,请设置以下代替auto_now_add=True
:
DateField
:default=date.today
- 从datetime.date.today()
DateTimeField
:default=timezone.now
- 从django.utils.timezone.now()
这个字段默认的表单组件是一个TextInput
. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮. 包含了一个额外的invalid_date
错误消息键.
default
, auto_now
, and auto_now_add
这些设置是相互排斥的.
他们之间的任何组合将会发生错误的结果.
注
在目前的实现中,设置auto_now
或者auto_now_add
为True
将导致这个字段同时具有editable=False
和blank=True
这两个设置.
注
在对象创建或更新时,auto_now
和auto_now_add
这两个设置将始终使用default timezone(默认时区)的日期。 如果你需要不同的东西,你可能只想使用自己的可调用的默认值或者覆盖save()
而不是使用auto_now
或auto_now_add
;或使用DateTimeField
代替DateField
,并决定如何在显示时处理从datetime到date的转换。
DateTimeField
¶它是通过Python datetime.datetime
实例表示的日期和时间.
携带了跟DateField
一样的额外参数.
该字段默认对应的表单控件是一个单个的TextInput
(单文本输入框). 管理界面是使用两个带有 JavaScript控件的 TextInput
文本框.
DecimalField
¶用python中 Decimal
的一个实例来表示十进制浮点数. 有两个 必须的参数:
DecimalField.
max_digits
¶位数总数,包括小数点后的位数。 该值必须大于等于decimal_places
.
DecimalField.
decimal_places
¶小数点后的数字数量
例如,要保存最大为 999
并有两位小数的数字,你应该使用:
models.DecimalField(..., max_digits=5, decimal_places=2)
而要存储那些将近10亿,并且要求达到小数点后十位精度的数字:
models.DecimalField(..., max_digits=19, decimal_places=10)
当localize
为False
或TextInput
时,该字段的默认表单小部件是NumberInput
。
注
想获取更多关于 FloatField
和 DecimalField
差异, 请参照 FloatField vs. DecimalField.
DurationField
¶用作存储一段时间的字段类型 - 类似Python中的timedelta
. 当数据库使用的是PostgreSQL, 该数据类型使用的是一个 interval
而在Oracle上,则使用的是 INTERVAL DAY(9) TO SECOND(6)
. 否则使用微秒的bigint
。
注
DurationField
的算数运算在多数情况下可以很好的工作。 然而,在除了PostgreSQL之外的其他数据库中, 将 DurationField
与 DateTimeField
的实例比较则不会得到正确的结果。
EmailField
¶一个 CharField
用来检查输入的email地址是否合法。 它使用 EmailValidator
来验证输入合法性。
FileField
¶上传文件字段。
注
不支持primary_key
参数,如果使用将引发错误。
有两个可选参数:
FileField.
upload_to
¶该属性提供设置上传目录和文件名的方式,可以通过两种方式进行设置。 在这两种情况下,值都将传递到Storage.save()
方法。
如果指定一个字符串值,它可以包含strftime()
的格式,这个格式将被文件上传的日期/时间替换(这样上传的文件不会填满给定的目录)。 例如:
class MyModel(models.Model):
# 文件将上传到MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
# 或者...
# 文件将保存到MEDIA_ROOT/uploads/2015/01/30
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
如果使用默认的FileSystemStorage
,则字符串值将附加到MEDIA_ROOT
路径中形成文件系统上的位置用于保存上传的文件。 如果使用的是其它存储,请检查该存储的文档,了解它如何处理upload_to
。
upload_to
也可以是可调用的对象,例如函数。 这将被调用来生成上传路径,包括文件名。 此可调用必须接受两个参数,并返回一个Unix样式的路径(带有斜杠),以便传递到存储系统。 两个参数是:
参数 | 描述 |
---|---|
instance |
大部分情况下,这个实例还没有保存到数据库中,若它用到默认的 |
filename |
最初给文件的文件名。 当确定最终目的地路径时,这可能或可能不被考虑。 |
例如:
def user_directory_path(instance, filename):
# file will be uploaded to 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)
这个字段的默认表单Widget 是ClearableFileInput
。
在模型中调用FileField
或 ImageField
(见下方) 需如下几步:
MEDIA_ROOT
作为Django存储上传文件的路径
(从性能上考虑,这些文件不能存在数据库中。) 定义一个 MEDIA_URL
作为基础的URL或者目录。 确保这个目录可以被web server使用的账户写入。FileField
或ImageField
字段, 定义upload_to
选项来指定MEDIA_ROOT
的一个子目录用于存放上传的文件。MEDIA_ROOT
)。 你很可能会想用由Django提供的便利的url
属性。 比如说, 如果你的ImageField
命名为mug_shot
, 你可以在template中用{{ object.mug_shot.url }}
获得你照片的绝对路径。例如,如果你的 MEDIA_ROOT
设定为 '/home/media'
,并且 upload_to
设定为 'photos/%Y/%m/%d'
。 upload_to
的'%Y/%m/%d'
是strftime()
格式;'%Y'
是四位数年份,'%m'
是两位数的月份,'%d'
是两位数的天数。 如果你在Jan.15.2007上传了一个文件,它将被保存在/home/media/photos/2007/01/15
目录下。
如果要检索上传的文件的磁盘文件名或文件大小,则可以分别使用name
和size
属性;有关可用属性和方法的更多信息,请参见File
类参考和管理文件主题指南。
注
保存的文件作为模型存储在数据库中的一部分,所以在磁盘上使用的实际的文件名在模型保存完毕之前是不可靠的。
上传的文件对应的URL可以通过使用 url
属性获得. 在内部,它会调用 Storage
类下的url()
方法.
值得注意的是,无论你在任何时候处理上传文件的需求,你都应该密切关注你的文件将被上传到哪里,上传的文件类型,以避免安全漏洞。 认证所有上传文件 以确保那些上传的文件是你所认为的文件。 例如,如果你盲目的允许其他人在无需认证的情况下上传文件至你的web服务器的root目录中,那么别人可以上传一个CGI或者PHP脚本然后通过访问一个你网站的URL来执行这个脚本。 所以,不要允许这种事情发生。
甚至是上传HTML文件也值得注意,它可以通过浏览器(虽然不是服务器)执行,也可以引发相当于是XSS或者CSRF攻击的安全威胁。
FileField
实例将会在你的数据库中创建一个默认最大长度为100字符的varchar
列。 就像其他的fields一样, 你可以用 max_length
参数改变最大长度的值.
FileField
和 FieldFile
¶当你添加 FileField
到你的模型中时, 你实际上会获得一个 FieldFile
的实例来替代将要访问的文件。
FieldFile
的API反映了File
的API,其中一个不同之处在于: 由类包装的对象不一定是围绕Python的内置文件对象的包装。 Instead, it is a wrapper around
the result of the Storage.open()
method, which may be a File
object, or it may be a
custom storage’s implementation of the File
API.
除了File
继承的API,例如read()
和write()
,FieldFile
包含几种方法可用于与底层文件交互:
FieldFile.
name
¶该文件的名称包括相关的FileField
的Storage
根的相对路径。
FieldFile.
size
¶底层Storage.size()
方法的结果。
FieldFile.
url
¶该文件的URL,它是一个只读属性,通过调用底层Storage
类的url()
方法得到。
在指定的mode
中打开或重新打开与该实例关联的文件。 与标准Python open()
方法不同,它不返回文件描述符。
由于底层文件在访问时隐含打开,因此除了将指针重置到底层文件或更改mode
之外,可能无需调用此方法。
该方法像标准的Pythonfile.close()
方法,并关闭相关文件.
这个方法会将文件名以及文件内容传递到字段的storage类中,并将模型字段与保存好的文件关联.
如果想要手动关联文件数据到你的模型中的 FileField
实例, 则save()
方法总是用来保存该数据.
方法接受两个必选参数: name
文件名, 和 content
文件内容. 可选参数save
控制模型实例在关联的文件被修改时是否保存. 默认为 True
.
注意参数 content
应该是 django.core.files.File
的一个实例, 而不是Python内建的File对象.
你可以用如下方法从一个已经存在的Python文件对象来构建 File
:
from django.core.files import File
# Open an existing file using Python's built-in open()
f = open('/path/to/hello.world')
myfile = File(f)
或者,你可以像下面的一样从一个python字符串中构建
from django.core.files.base import ContentFile
myfile = ContentFile("hello world")
更多信息, 请参见 Managing files.
删除与此实例关联的文件,并清除该字段的所有属性。 注意︰ 如果它碰巧是开放的调用 delete()
方法 时,此方法将关闭该文件。
可选参数save
控制模型实例在与此字段关联的在文件删除后是否保存。 默认为 True
.
注意,model删除的时候,与之关联的文件并不会被删除。 如果你要把文件也清理掉,你需要自己处理。
FilePathField
¶一个 CharField
,内容只限于文件系统内特定目录下的文件名。 有三个参数, 其中第一个是 必需的:
FilePathField.
path
¶必填。 这个FilePathField
应该得到其选择的目录的绝对文件系统路径。 例如: "/home/images"
.
FilePathField.
match
¶可选的. FilePathField
将会作为一个正则表达式来匹配文件名。 但请注意正则表达式将将被作用于基本文件名,而不是完整路径。 例如: "foo.*\.txt$"
,它将匹配一个名为foo23.txt
但不是bar.txt
或foo23.png
的文件。
FilePathField.
allow_files
¶可选的. True
或 False
. 默认是True
. 声明是否包含指定位置的文件。 该参数或allow_folders
中必须有一个为 True
.
FilePathField.
allow_folders
¶可选的. True
或 False
. 默认值是 False
。 声明是否包含指定位置的文件夹。 该参数或 allow_files
中必须有一个为 True
.
当然,这些参数可以同时使用。
有一点需要提醒的是 match
只匹配基本文件名(base filename), 而不是整个文件路径(full path). 例如:
FilePathField(path="/home/images", match="foo.*", recursive=True)
...将匹配/home/images/foo.png
,但不符合/home/images/foo/bar.png
,因为match
适用于基本文件名(foo.png
和bar.png
)。
FilePathField
实例被创建在您的数据库为varchar
列默认最大长度为 100 个字符。 就像其他的fields一样, 你可以用 max_length
参数改变最大长度的值.
FloatField
¶用Python的一个float
实例来表示一个浮点数.
当localize
为False
或TextInput
时,该字段的默认表单小部件是NumberInput
。
FloatField
与DecimalField
有时候FloatField
类会和DecimalField
类发生混淆. 虽然它们表示都表示实数,但是二者表示数字的方式不一样。 FloatField
使用的是Python内部的 float
类型, 而DecimalField
使用的是Python的 Decimal
类型. 想要了解更多二者的差别, 可以查看Python文档中的 decimal
模块.
ImageField
¶ImageField
(upload_to=None, height_field=None, width_field=None, max_length=100, **options)[source]¶继承FileField
的所有属性和方法,但还对上传的对象进行校验,确保它是个有效的图片。
除了从FileField
继承来的属性外,ImageField
还有height
和 width
属性。
为了方便查询属性, ImageField
有两个额外的可选参数。
ImageField.
height_field
¶模型字段的名称,在模型实例每次保存时将自动填写为图片的高度。
ImageField.
width_field
¶模型字段的名称,在模型实例每次保存时将自动填写为图片的宽度。
需要Pillow库。
ImageField
在你的数据库中创建为varchar
列,默认最大长度为100个字符。 类似其它fields,你可以用max_length
参数改变最大长度。
这个字段的默认表单Widget是ClearableFileInput
。
IntegerField
¶一个整数。 在Django所支持的所有数据库中,从 -2147483648
到 2147483647
范围内的值是合法的。 当localize
为False
或TextInput
时,该字段的默认表单小部件是NumberInput
。
GenericIPAddressField
¶一个 IPv4 或 IPv6 地址, 字符串格式 (例如 192.0.2.30
或 2a02:42fe::4
). 这个字段默认的表单组件是一个TextInput
.
IPv6地址规范化遵循 RFC 4291#section-2.2第2.2节,包括使用该段第3段中建议的IPv4格式,如::ffff:192.0.2.0
例如,::ffff:0a0a:0a0a
将被归一化为2001::1
和2001:0::0:01
::ffff:10.10.10.10
。 所有字符都转换为小写。
GenericIPAddressField.
protocol
¶限制指定协议的有效输入。
接受的值为'IPv6'
(默认值),'IPv4'
或'both'
。 匹配不区分大小写。
GenericIPAddressField.
unpack_ipv4
¶解析IPv4映射地址如 ::ffff:192.0.2.1
.
如果启用该选项,则地址将被解析到192.0.2.1
. 默认为禁用。 只有当protocol
设置为'both'
时才可以使用。
如果允许空白值,则必须允许null值,因为空白值存储为null。
NullBooleanField
¶类似BooleanField
, 但是允许 NULL
作为一个选项. 使用此代替null=True
的BooleanField
。 此字段的默认表单widget为NullBooleanSelect
。
PositiveIntegerField
¶类似 IntegerField
, 但值必须是正数或者零(0
).
从0
到2147483647
的值在Django支持的所有数据库中都是安全的。 由于向后兼容性原因,接受值0
。
PositiveSmallIntegerField
¶该模型字段类似 PositiveIntegerField
, 但是只允许小于某一特定值(依据数据库类型而定)。 从0
到 32767
这个区间,对于Django所支持的所有数据库而言都是安全的。
SlugField
¶Slug 是一个新闻术语(通常叫做短标题)。 一个slug只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。 通常它们是用来放在URL里的。
像CharField一样,你可以指定max_length
(也请参阅该部分中的有关数据库可移植性的说明和max_length
)。 如果没有指定 max_length
, Django将会默认长度为50。
将Field.db_index
设置为True
。
根据某些其他值的值自动预填充SlugField通常很有用。 你可以在admin中使用prepopulated_fields
自动执行此操作。
SlugField.
allow_unicode
¶如果True
,该字段除了ASCII字母外还接受Unicode字母。 默认为False
。
SmallIntegerField
¶Like an IntegerField, but only allows values under a certain (database-dependent) point. IntegerField
对于django来讲,该字段值在 -32768
至 32767
这个范围内对所有可支持的数据库都是安全的。
TextField
¶大文本字段。 该模型默认的表单组件是Textarea
。
如果你在这个字段类型中使用了max_length
属性,它将会在渲染页面表单元素Textarea
时候体现出来。
但是并不会在model或者数据库级别强制性的限定字段长度。 请使用CharField
。
TimeField
¶时间字段,和Python中 datetime.time
一样。 接受与DateField
相同的自动填充选项。
这个字段默认的表单组件是一个TextInput
.
Admin添加一些JavaScript快捷方式。
URLField
¶一个CharField
类型的URL
这个字段默认的表单组件是一个TextInput
.
与所有CharField
子类一样,URLField
接受可选的max_length
参数。 如果不指定max_length
,则使用默认值200。
UUIDField
¶一个用来存储UUID的字段。 使用Python的UUID
类。 当使用PostgreSQL数据库时,该字段类型对应的数据库中的数据类型是uuid
,使用其他数据库时,数据库对应的是char(32)
类型。
primary_key
用AutoField
的另外一个好的选择就是UUID。 数据库不会自动生成UUID,所以推荐使用default
参数:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields
注意:这里传递给default是一个可调用的对象(即一个省略了括号的方法),而不是传递一个default
实例给UUID
Field
[source]¶Field
是一个抽象的类, 用来代表数据库中的表的一列.
Django使用字段创建数据库表(db_type()
),将Python类型映射到数据库(get_prep_value()
),反之亦然(from_db_value()
field 是不同Django版本API中最根本的部分,尤其是models
and querysets
.
在模型中,一个字段被实例化为类的属性,并表现为一个特定的表的列,详情查看Models. 它具有null
和unique
等属性,以及Django用于将字段值映射到数据库特定值的方法。
field_name__exact="foo"
是RegisterLookupMixin
的子类,因此可以在其上注册Transform
和Lookup
QuerySet
s(例如Field
)。 默认情况下,所有built-in
lookups都已注册。
Django的所有内建字段,如CharField
都是Field
的特定实现。 如果您需要自定义字段,则可以将任何内置字段子类化,也可以从头开始写入Field
。 无论哪种情况,请参阅Writing custom model fields。
description
¶字段的详细说明,例如用于django.contrib.admindocs
应用程序。
描述可以是以下形式:
description = _("String (up to %(max_length)s)")
其中参数从字段的__dict__
插入。
要将Field
映射到数据库特定类型,Django会公开几种方法:
get_internal_type
()[source]¶返回一个字符串,命名此字段以用于后端特定用途。 默认情况下,它返回类名。
有关自定义字段中的用法,请参见Emulating built-in field types。
db_type
(connection)[source]¶返回Field
的数据库列数据类型,同时考虑connection
。
有关自定义字段中的用法,请参见Custom database types。
rel_db_type
(connection)[source]¶返回指向Field
的字段的数据库列数据类型,例如ForeignKey
和OneToOneField
,考虑connection
有关自定义字段中的用法,请参见Custom database types。
有三种主要情况,Django需要与数据库后端和字段交互:
查询时,使用get_db_prep_value()
和get_prep_value()
:
get_prep_value
(value)[source]¶value
是模型属性的当前值,方法应以已准备好用作查询中的参数的格式返回数据。
有关使用方式,请参阅Converting Python objects to query values。
get_db_prep_value
(value, connection, prepared=False)[source]¶将value
转换为后端特定值。 如果False
和get_prep_value()
if为prepared=True
,则默认返回value
。
加载数据时,使用from_db_value()
:
from_db_value
(value, expression, connection, context)¶将数据库返回的值转换为Python对象。 它与get_prep_value()
相反。
此方法不用于大多数内置字段,因为数据库后端已返回正确的Python类型,或后端本身执行转换。
有关用法,请参见Converting values to Python objects。
注
出于性能原因,from_db_value
在不需要它的字段(所有Django字段)上不实现为无操作。
因此,您不能在定义中调用super
。
保存时,使用pre_save()
和get_db_prep_save()
get_db_prep_save
(value, connection)[source]¶与get_db_prep_value()
相同,但在字段值必须保存到数据库时调用。 默认返回get_db_prep_value()
。
pre_save
(model_instance,add)[source] ¶在get_db_prep_save()
之前调用方法以在保存之前准备值(例如,对于DateField.auto_now
)。
model_instance
是此字段所属的实例,add
是实例是否第一次保存到数据库。
它应该返回此字段的model_instance
适当属性的值。 属性名称位于self.attname
(这是由Field
设置)。
有关使用情况,请参阅Preprocessing values before saving。
字段经常从不同的类型接收它们的值,从序列化或从表单。
to_python
(value)[source]¶改变这个值为正确的python对象。 它作为value_to_string()
的反向操作,也在clean()
中调用。
有关用法,请参见Converting values to Python objects。
除了保存到数据库,该字段还需要知道如何序列化其值:
当使用model forms
时,Field
需要知道应由哪个表单字段表示:
formfield
(form_class=None, choices_form_class=None, **kwargs)[source]¶返回ModelForm
的此字段的默认django.forms.Field
。
默认情况下,如果form_class
和choices_form_class
都是None
,则使用CharField
。 如果没有指定choices
和choices_form_class
,则使用TypedChoiceField
。
deconstruct
()[source]¶返回具有足够信息的4元组,以重新创建字段:
"django.db.models.IntegerField"
)。
这应该是兼容的版本,所以不要太具体可能会更好。必须将此方法添加到1.7之前的字段,才能使用Migrations迁移其数据。
每个Field
实例包含几个允许内省其行为的属性。 使用这些属性而不是isinstance
检查何时需要编写取决于字段功能的代码。
这些属性可与Model._meta API一起使用,以缩小特定字段类型的搜索范围。
自定义模型字段应实现这些标志。
Field.
auto_created
¶布尔标志,指示是否自动创建字段,例如模型继承使用的OneToOneField
。
Field.
concrete
¶布尔标志,指示字段是否具有与其相关联的数据库列。
布尔标志,指示是否使用字段来回复另一个非隐藏字段的功能(例如,构成GenericForeignKey
的object_id
和content_type
)。 hidden
标志用于区分模型上的公共字段子集构成模型上的所有字段。
注
Options.get_fields()
默认排除隐藏字段。 传入include_hidden=True
可返回结果中的隐藏字段。
Field.
is_relation
¶布尔标志,指示字段是否包含对其功能的一个或多个其他模型的引用(例如,ForeignKey
,ManyToManyField
,OneToOneField
等。)。
Field.
model
¶返回定义字段的模型。 如果在模型的超类上定义了字段,则model
将引用超类,而不是实例的类。
这些属性用于查询关系的基数和其他详细信息。 这些属性存在于所有字段中;但是,如果该字段是关系类型(Field.is_relation=True
),它们将只有布尔值(而不是None
)。
Field.
many_to_many
¶如果该字段具有多对多关系,则为True
的布尔标志;否则False
。 Django中包含的仅有True
的字段为ManyToManyField
。
Field.
many_to_one
¶如果该字段具有多对一关系,例如ForeignKey
,则为True
的布尔标志; False
否则。
Field.
one_to_many
¶如果该字段具有一对多关系,例如GenericRelation
或ForeignKey
的相反,则为True
的布尔标志; False
否则。
Field.
one_to_one
¶如果字段具有一对一的关系,例如OneToOneField
,则为True
的布尔标志; False
否则。
指向字段涉及的模型。 例如,ForeignKey(作者, on_delete = models.CASCADE)
中的Author
。 GenericForeignKey
的related_model
始终为None
。
2017年9月6日