字段选项
以下参数可用于所有字段类型。 都是可选的。
null
- Field.null
如果是 True
,Django 将在数据库中将空值存储为 NULL
。 默认值为 False
。
避免在基于字符串的字段上使用 null,例如 CharField 和 TextField。 如果基于字符串的字段具有 null=True
,则意味着“无数据”有两个可能的值:NULL
和空字符串。 在大多数情况下,“无数据”有两个可能的值是多余的; Django 约定是使用空字符串,而不是 NULL
。 一个例外是 CharField 同时设置了 unique=True
和 blank=True
。 在这种情况下,需要 null=True
以避免在保存具有空白值的多个对象时违反唯一约束。
对于基于字符串和非基于字符串的字段,如果您希望在表单中允许空值,您还需要设置 blank=True
,因为 null 参数仅影响数据库存储(见 空白 )。
笔记
当使用 Oracle 数据库后端时,值 NULL
将被存储以表示空字符串,而不管该属性如何。
blank
- Field.blank
如果是True
,则该字段可以为空。 默认值为 False
。
请注意,这与 null 不同。 null 纯粹与数据库相关,而 blank 与验证相关。 如果字段具有 blank=True
,则表单验证将允许输入空值。 如果字段具有 blank=False
,则该字段将是必需的。
choices
- Field.choices
一个 序列 由恰好两个项目的迭代组成(例如 [(A, B), (A, B) ...]
) 用作此字段的选项。 如果给出了选择,则它们由 模型验证 强制执行,并且默认表单小部件将是带有这些选择的选择框,而不是标准文本字段。
每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。 例如:
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
]
通常,最好在模型类中定义选择,并为每个值定义一个适当命名的常量:
from django.db import models
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
GRADUATE = 'GR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
(GRADUATE, 'Graduate'),
]
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}
尽管您可以在模型类之外定义一个选择列表然后引用它,但是在模型类中定义每个选择的选择和名称会保留使用它的类的所有信息,并有助于引用这些选择(例如, Student.SOPHOMORE
将在任何已导入 Student
模型的地方工作)。
您还可以将可用选项收集到可用于组织目的的命名组中:
MEDIA_CHOICES = [
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
]
每个元组中的第一个元素是应用于组的名称。 第二个元素是一个 2 元组的可迭代对象,每个 2 元组包含一个值和一个人类可读的选项名称。 分组选项可以与单个列表中的未分组选项组合(例如本示例中的 'unknown'
选项)。
对于每个设置了 choices 的模型字段,Django 将添加一个方法来检索字段当前值的可读名称。 请参阅数据库 API 文档中的 get_FOO_display()。
请注意,选择可以是任何序列对象——不一定是列表或元组。 这使您可以动态构建选择。 但是,如果您发现自己将 choices 修改为动态,则最好使用带有 ForeignKey 的适当数据库表。 choices 用于不会发生太大变化的静态数据,如果有的话。
笔记
每次 choices
的顺序更改时,都会创建一个新的迁移。
除非 blank=False 与 default 一起在字段上设置,那么包含 "---------"
的标签将与选择框一起呈现。 要覆盖此行为,请向包含 None
的 choices
添加一个元组; 例如 (None, 'Your String For Display')
。 或者,您可以使用空字符串而不是 None
,这是有意义的 - 例如在 CharField 上。
枚举类型
此外,Django 提供了枚举类型,您可以将其子类化以简洁的方式定义选项:
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {
self.YearInSchool.JUNIOR,
self.YearInSchool.SENIOR,
}
这些工作类似于 Python 标准库中的 enum
,但有一些修改:
- 枚举成员值是构造具体数据类型时要使用的参数元组。 Django 支持在这个元组的末尾添加一个额外的字符串值,用作人类可读的名称,或
label
。 label
可以是一个懒惰的可翻译字符串。 因此,在大多数情况下,成员值将是一个 (value, label)
二元组。 请参阅下面的 使用更复杂数据类型的子类化选项 的示例。 如果未提供元组,或者最后一项不是(懒惰)字符串,则 label
是 从成员名称自动生成的 。
.label
属性被添加到值上,以返回人类可读的名称。
- 许多自定义属性添加到枚举类 -
.choices
、.labels
、.values
和 .names
- 以便更容易访问这些列表枚举的单独部分。 使用 .choices
作为合适的值传递给字段定义中的 choices。
- 强制使用
enum.unique()
以确保值不能被多次定义。 这在一个领域的选择中是不太可能预料到的。
请注意,使用 YearInSchool.SENIOR
、YearInSchool['SENIOR']
或 YearInSchool('SR')
来访问或查找枚举成员按预期工作,.name
和 .value
也是如此成员的属性。
如果您不需要翻译人类可读的名称,您可以从成员名称推断它们(用空格替换下划线并使用标题大小写):
>>> class Vehicle(models.TextChoices):
... CAR = 'C'
... TRUCK = 'T'
... JET_SKI = 'J'
...
>>> Vehicle.JET_SKI.label
'Jet Ski'
由于枚举值需要为整数的情况非常普遍,Django 提供了一个 IntegerChoices
类。 例如:
class Card(models.Model):
class Suit(models.IntegerChoices):
DIAMOND = 1
SPADE = 2
HEART = 3
CLUB = 4
suit = models.IntegerField(choices=Suit.choices)
也可以使用 Enum Functional API,但需要注意标签是自动生成的,如上所示:
>>> MedalType = models.TextChoices('MedalType', 'GOLD SILVER BRONZE')
>>> MedalType.choices
[('GOLD', 'Gold'), ('SILVER', 'Silver'), ('BRONZE', 'Bronze')]
>>> Place = models.IntegerChoices('Place', 'FIRST SECOND THIRD')
>>> Place.choices
[(1, 'First'), (2, 'Second'), (3, 'Third')]
如果您需要支持 int
或 str
以外的具体数据类型,您可以将 Choices
和所需的具体数据类型子类化,例如 date
用于 DateField:
class MoonLandings(datetime.date, models.Choices):
APOLLO_11 = 1969, 7, 20, 'Apollo 11 (Eagle)'
APOLLO_12 = 1969, 11, 19, 'Apollo 12 (Intrepid)'
APOLLO_14 = 1971, 2, 5, 'Apollo 14 (Antares)'
APOLLO_15 = 1971, 7, 30, 'Apollo 15 (Falcon)'
APOLLO_16 = 1972, 4, 21, 'Apollo 16 (Orion)'
APOLLO_17 = 1972, 12, 11, 'Apollo 17 (Challenger)'
还有一些额外的警告需要注意:
db_column
- Field.db_column
用于此字段的数据库列的名称。 如果没有给出,Django 将使用该字段的名称。
如果您的数据库列名称是 SQL 保留字,或者包含 Python 变量名称中不允许的字符(尤其是连字符),那也没关系。 Django 在幕后引用列名和表名。
db_index
- Field.db_index
如果是 True
,将为此字段创建数据库索引。
default
- Field.default
字段的默认值。 这可以是值或可调用对象。 如果可调用,则每次创建新对象时都会调用它。
默认值不能是可变对象(模型实例、list
、set
等),因为对该对象的同一实例的引用将用作所有对象的默认值新模型实例。 相反,将所需的默认值包装在一个可调用对象中。 例如,如果要为 JSONField 指定默认的 dict
,请使用函数:
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
lambda
s 不能用于像 default
这样的字段选项,因为它们不能被迁移 序列化 。 有关其他注意事项,请参阅该文档。
对于像 ForeignKey 这样映射到模型实例的字段,默认值应该是它们引用的字段的值(pk
,除非设置了 to_field)而不是模型实例。
在创建新模型实例并且未为该字段提供值时使用默认值。 当字段为主键时,字段设置为None
时也使用默认值。
editable
- Field.editable
如果是 False
,该字段将不会显示在 admin 或任何其他 ModelForm 中。 在 模型验证 期间也会跳过它们。 默认值为 True
。
error_messages
- Field.error_messages
error_messages
参数允许您覆盖该字段将引发的默认消息。 传入一个字典,其键与要覆盖的错误消息匹配。
错误信息键包括 null
、blank
、invalid
、invalid_choice
、unique
和 unique_for_date
。 在下面的 字段类型 部分中为每个字段指定了其他错误消息键。
这些错误消息通常不会传播到表单。 请参阅 关于模型的 error_messages 的注意事项。
help_text
- Field.help_text
与表单小部件一起显示的额外“帮助”文本。 即使您的字段未在表单上使用,它也可用于文档。
请注意,此值在自动生成的表单中是 而非 HTML 转义。 如果您愿意,这允许您在 help_text 中包含 HTML。 例如:
help_text="Please use the following format: <em>YYYY-MM-DD</em>."
或者,您可以使用纯文本和 django.utils.html.escape() 来转义任何 HTML 特殊字符。 确保您对可能来自不受信任用户的任何帮助文本进行转义以避免跨站点脚本攻击。
unique_for_month
- Field.unique_for_month
与 unique_for_date 类似,但要求该字段相对于月份而言是唯一的。
verbose_name
- Field.verbose_name
字段的可读名称。 如果没有给出详细名称,Django 将使用字段的属性名称自动创建它,将下划线转换为空格。 请参阅 详细字段名称 。
validators
- Field.validators
要为此字段运行的验证器列表。 有关更多信息,请参阅 验证器文档 。
注册和获取查找
Field
实现了 查找注册 API。 API 可用于自定义字段类可用的查找,以及如何从字段中获取查找。
字段类型
AutoField
- class AutoField(**options)
IntegerField 根据可用 ID 自动递增。 您通常不需要直接使用它; 如果您没有另外指定,主键字段将自动添加到您的模型中。 请参阅 自动主键字段 。
BigAutoField
- class BigAutoField(**options)
一个 64 位整数,很像 AutoField,除了它保证适合从 1
到 9223372036854775807
的数字。
BigIntegerField
- class BigIntegerField(**options)
一个 64 位整数,很像 IntegerField,除了它保证适合从 -9223372036854775808
到 9223372036854775807
的数字。 此字段的默认表单小部件是 NumberInput。
BinaryField
- class BinaryField(max_length=None, **options)
存储原始二进制数据的字段。 可以分配 bytes
、bytearray
或 memoryview
。
默认情况下,BinaryField
将 editable 设置为 False
,在这种情况下,它不能包含在 ModelForm 中。
BinaryField
有一个额外的可选参数:
- BinaryField.max_length
- 字段的最大长度(以字节为单位)。 最大长度在 Django 的验证中使用 MaxLengthValidator 强制执行。
滥用 BinaryField
尽管您可能会考虑将文件存储在数据库中,但请考虑在 99% of 的情况下这是糟糕的设计。 该字段是 不是 替代正确的 静态文件 处理。
CharField
- class CharField(max_length=None, **options)
一个字符串字段,用于从小到大的字符串。
对于大量文本,请使用 TextField。
此字段的默认表单小部件是 TextInput。
CharField 有两个额外的参数:
- CharField.max_length
必需的。 字段的最大长度(以字符为单位)。 max_length 在数据库级别和 Django 的验证中使用 MaxLengthValidator 强制执行。
笔记
如果您正在编写一个必须可移植到多个数据库后端的应用程序,您应该注意某些后端对 max_length
的限制。 详情请参考数据库后端笔记。
- CharField.db_collation
-
可选的。 字段的数据库排序规则名称。
笔记
排序规则名称未标准化。 因此,这将无法跨多个数据库后端移植。
甲骨文
Oracle 仅在 MAX_STRING_SIZE
数据库初始化参数设置为 EXTENDED
时才支持排序规则。
DateField
- class DateField(auto_now=False, auto_now_add=False, **options)
一个日期,在 Python 中由 datetime.date
实例表示。 有一些额外的可选参数:
- DateField.auto_now
每次保存对象时自动将字段设置为现在。 对“上次修改”时间戳很有用。 注意当前日期是 always used; 它不仅仅是您可以覆盖的默认值。
该字段仅在调用 Model.save() 时自动更新。 以其他方式(例如 QuerySet.update())更新其他字段时,该字段不会更新,但您可以在这样的更新中为该字段指定自定义值。
- DateField.auto_now_add
- 首次创建对象时自动将字段设置为现在。 用于创建时间戳。 注意当前日期是 always used; 它不仅仅是您可以覆盖的默认值。 所以即使你在创建对象时为这个字段设置了一个值,它也会被忽略。 如果您希望能够修改此字段,请设置以下内容而不是
auto_now_add=True
:
此字段的默认表单小部件是 DateInput。 管理员添加了一个 JavaScript 日历和一个“今天”的快捷方式。 包括一个额外的 invalid_date
错误消息密钥。
选项 auto_now_add
、auto_now
和 default
是互斥的。 这些选项的任何组合都会导致错误。
笔记
按照目前的实施,将 auto_now
或 auto_now_add
设置为 True
将导致字段设置为 editable=False
和 blank=True
。
笔记
auto_now
和 auto_now_add
选项将始终使用创建或更新时 默认时区 中的日期。 如果您需要不同的东西,您可能需要考虑使用自己的可调用默认值或覆盖 save()
而不是使用 auto_now
或 auto_now_add
; 或者使用 DateTimeField
而不是 DateField
并决定如何在显示时间处理从日期时间到日期的转换。
DateTimeField
- class DateTimeField(auto_now=False, auto_now_add=False, **options)
日期和时间,在 Python 中由 datetime.datetime
实例表示。 采用与 DateField 相同的额外参数。
此字段的默认表单小部件是单个 DateTimeInput。 管理员使用两个单独的 TextInput 小部件和 JavaScript 快捷方式。
DecimalField
- class DecimalField(max_digits=None, decimal_places=None, **options)
一个固定精度的十进制数,在 Python 中由 Decimal
实例表示。 它使用 DecimalValidator 验证输入。
有两个 required 参数:
- DecimalField.max_digits
- 号码中允许的最大位数。 请注意,此数字必须大于或等于
decimal_places
。
- DecimalField.decimal_places
- 与数字一起存储的小数位数。
例如,要以 2 个小数位的分辨率存储高达 999
的数字,您可以使用:
models.DecimalField(..., max_digits=5, decimal_places=2)
并以 10 位小数的分辨率存储多达约 10 亿的数字:
models.DecimalField(..., max_digits=19, decimal_places=10)
当 localize 为 False
或 TextInput 时,此字段的默认表单小部件为 NumberInput。
DurationField
- class DurationField(**options)
用于存储时间段的字段 - 由 timedelta
在 Python 中建模。 在 PostgreSQL 上使用时,使用的数据类型是 interval
,而在 Oracle 上,数据类型是 INTERVAL DAY(9) TO SECOND(6)
。 否则使用微秒的 bigint
。
笔记
使用 DurationField
的算术在大多数情况下都有效。 但是,在除 PostgreSQL 之外的所有数据库上,将 DurationField
的值与 DateTimeField
实例上的算术进行比较将无法按预期工作。
FileField
- class FileField(upload_to=None, max_length=100, **options)
文件上传字段。
笔记
不支持 primary_key
参数,如果使用会引发错误。
有两个可选参数:
- FileField.upload_to
该属性提供了一种设置上传目录和文件名的方式,可以通过两种方式进行设置。 在这两种情况下,值都会传递给 Storage.save() 方法。
如果你指定一个字符串值或一个Path
,它可能包含strftime()
格式,它将被文件上传的日期/时间替换(这样上传的文件不会填满给定目录)。 例如:
class MyModel(models.Model):
# file will be uploaded to MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
# or...
# file will be saved to MEDIA_ROOT/uploads/2015/01/30
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
如果您使用默认的 FileSystemStorage,则字符串值将附加到您的 :setting:`MEDIA_ROOT` 路径以形成本地文件系统上将存储上传文件的位置。 如果您使用不同的存储,请查看该存储的文档以了解它如何处理 upload_to
。
upload_to
也可以是可调用的,例如函数。 这将被调用以获取上传路径,包括文件名。 这个可调用对象必须接受两个参数并返回要传递给存储系统的 Unix 样式路径(带正斜杠)。 这两个论点是:
论据
|
说明
|
instance
|
定义了 FileField 的模型实例。 更具体地说,这是附加当前文件的特定实例。
在大多数情况下,这个对象还没有被保存到数据库中,所以如果它使用默认的 AutoField 、,它的主键字段 可能还没有值。
|
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)
- FileField.storage
存储对象,或返回存储对象的可调用对象。 这将处理文件的存储和检索。 有关如何提供此对象的详细信息,请参阅 管理文件 。
此字段的默认表单小部件是 ClearableFileInput。
在模型中使用 FileField 或 ImageField(见下文)需要几个步骤:
- 在您的设置文件中,您需要将 :setting:`MEDIA_ROOT` 定义为您希望 Django 存储上传文件的目录的完整路径。 (为了性能,这些文件不存储在数据库中。)将 :setting:`MEDIA_URL` 定义为该目录的基本公共 URL。 确保该目录可由 Web 服务器的用户帐户写入。
- 将 FileField 或 ImageField 添加到您的模型中,定义 upload_to 选项以指定要使用的 :setting:`MEDIA_ROOT` 的子目录对于上传的文件。
- 所有将存储在您的数据库中的是文件的路径(相对于 :setting:`MEDIA_ROOT`)。 您很可能希望使用 Django 提供的便利 url 属性。 例如,如果您的 ImageField 被称为
mug_shot
,您可以使用 模板:Object.mug shot.url
在模板中获取图像的绝对路径。
例如,假设您的 :setting:`MEDIA_ROOT` 设置为 '/home/media'
,而 upload_to 设置为 'photos/%Y/%m/%d'
。 upload_to的'%Y/%m/%d'
部分为strftime()
格式; '%Y'
是四位数年份,'%m'
是两位数月份,'%d'
是两位数日。 如果您在 1 月上传文件 2007 年 15 月 15 日,它将保存在目录 /home/media/photos/2007/01/15
中。
如果要检索上传文件的磁盘文件名或文件大小,可以分别使用 name 和 size 属性; 有关可用属性和方法的更多信息,请参阅 File 类参考和 Managing files 主题指南。
笔记
该文件作为在数据库中保存模型的一部分而保存,因此在保存模型之前不能依赖磁盘上使用的实际文件名。
上传文件的相对 URL 可以通过 url 属性获取。 在内部,这会调用底层 Storage 类的 url() 方法。
请注意,无论何时处理上传的文件,都应密切注意上传文件的位置和文件类型,以避免出现安全漏洞。 验证所有上传的文件,以便您确定这些文件是您认为的那样。 例如,如果您盲目地让某人在未经验证的情况下将文件上传到您的 Web 服务器文档根目录中的目录,那么有人可以上传 CGI 或 PHP 脚本并通过访问其在您站点上的 URL 来执行该脚本。 不允许这样。
还要注意的是,即使是上传的 HTML 文件,由于它可以由浏览器执行(尽管不能由服务器执行),因此也可能造成相当于 XSS 或 CSRF 攻击的安全威胁。
FileField 实例在您的数据库中创建为 varchar
列,默认最大长度为 100 个字符。 与其他字段一样,您可以使用 max_length 参数更改最大长度。
FileField 和 FieldFile
- class FieldFile
当您访问模型上的 FileField 时,您将获得一个 FieldFile 实例作为访问底层文件的代理。
FieldFile 的 API 与 File 的 API 相同,有一个关键区别:类包装的对象不一定是 Python 内置文件对象的包装器。 ] 相反,它是 Storage.open() 方法的结果的包装器,它可能是一个 File 对象,或者它可能是 的自定义存储实现]文件 API。
除了继承自 File 的 API,如 read()
和 write()
,FieldFile 还包括几个可以用来与底层文件交互的方法:
- FieldFile.name
文件的名称,包括从相关 FileField 的 Storage 的根的相对路径。
- FieldFile.path
通过调用底层 Storage 类的 path() 方法访问文件的本地文件系统路径的只读属性。
- FieldFile.size
底层 Storage.size() 方法的结果。
- FieldFile.url
通过调用底层 Storage 类的 url() 方法访问文件的相对 URL 的只读属性。
- FieldFile.open(mode='rb')
在指定的 mode
中打开或重新打开与此实例关联的文件。 与标准 Python open()
方法不同,它不返回文件描述符。
由于底层文件在访问时是隐式打开的,因此除了重置指向底层文件的指针或更改mode
之外,可能没有必要调用此方法。
- FieldFile.close()
行为类似于标准 Python file.close()
方法并关闭与此实例关联的文件。
- FieldFile.save(name, content, save=True)
此方法获取文件名和文件内容,并将它们传递给字段的存储类,然后将存储的文件与模型字段相关联。 如果您想手动将文件数据与模型上的 FileField 实例相关联,可以使用 save()
方法来保存该文件数据。
接受两个必需的参数:name
是文件名,content
是一个包含文件内容的对象。 可选的 save
参数控制在更改与此字段关联的文件后是否保存模型实例。 默认为 True
。
请注意, content
参数应该是 django.core.files.File 的实例,而不是 Python 的内置文件对象。 您可以从现有的 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")
有关更多信息,请参阅 管理文件 。
- FieldFile.delete(save=True)
删除与此实例关联的文件并清除该字段的所有属性。 注意:如果在调用 delete()
时碰巧打开了该文件,则此方法将关闭该文件。
可选的 save
参数控制在删除与此字段关联的文件后是否保存模型实例。 默认为 True
。
请注意,删除模型时,不会删除相关文件。 如果您需要清理孤立文件,则需要自己处理(例如,使用自定义管理命令可以手动运行或安排定期运行,例如 cron)。
FilePathField
- class FilePathField(path=, match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)
A CharField 其选择仅限于文件系统上某个目录中的文件名。 有一些特殊的参数,其中第一个是 required:
- FilePathField.path
必需的。 此 FilePathField 应从中获取其选择的目录的绝对文件系统路径。 示例:"/home/images"
。
path
也可能是一个可调用的,比如一个在运行时动态设置路径的函数。 例子:
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)
- FilePathField.match
- 可选的。 FilePathField 将用于过滤文件名的正则表达式,作为字符串。 请注意,正则表达式将应用于基本文件名,而不是完整路径。 示例:
"foo.*\.txt$"
,它将匹配名为 foo23.txt
但不匹配 bar.txt
或 foo23.png
的文件。
- FilePathField.recursive
- 可选的。
True
或 False
。 默认值为 False
。 指定是否应包含 path 的所有子目录
- FilePathField.allow_files
- 可选的。
True
或 False
。 默认值为 True
。 指定是否应包含指定位置的文件。 此或 allow_folders 必须为 True
。
- FilePathField.allow_folders
- 可选的。
True
或 False
。 默认值为 False
。 指定是否应包括指定位置的文件夹。 此或 allow_files 必须为 True
。
一个潜在的问题是 match 适用于基本文件名,而不是完整路径。 所以,这个例子:
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 个字符。 与其他字段一样,您可以使用 max_length 参数更改最大长度。
FloatField
- class FloatField(**options)
Python 中由 float
实例表示的浮点数。
当 localize 为 False
或 TextInput 时,此字段的默认表单小部件为 NumberInput。
FloatField
对比 DecimalField
FloatField 类有时会与 DecimalField 类混淆。 虽然它们都代表实数,但它们代表这些数字的方式不同。 FloatField
在内部使用 Python 的 float
类型,而 DecimalField
使用 Python 的 Decimal
类型。 有关两者之间的区别的信息,请参阅 decimal
模块的 Python 文档。
ImageField
- class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
从 FileField 继承所有属性和方法,但也验证上传的对象是有效的图像。
除了可用于 FileField 的特殊属性外,ImageField 还具有 height
和 width
属性。
为了方便查询这些属性,ImageField 有两个额外的可选参数:
- ImageField.height_field
- 模型字段的名称,每次保存模型实例时都会自动填充图像的高度。
- ImageField.width_field
- 模型字段的名称,每次保存模型实例时都会自动填充图像的宽度。
需要 枕头 库。
ImageField 实例在您的数据库中创建为 varchar
列,默认最大长度为 100 个字符。 与其他字段一样,您可以使用 max_length 参数更改最大长度。
此字段的默认表单小部件是 ClearableFileInput。
GenericIPAddressField
- class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)
字符串格式的 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
。 例如,2001:0::0:01
将归一化为 2001::1
,而 ::ffff:0a0a:0a0a
将归一化为 ::ffff:10.10.10.10
。 所有字符都转换为小写。
- GenericIPAddressField.protocol
- 将有效输入限制为指定协议。 可接受的值为
'both'
(默认)、'IPv4'
或 'IPv6'
。 匹配不区分大小写。
- GenericIPAddressField.unpack_ipv4
- 解压缩 IPv4 映射地址,如
::ffff:192.0.2.1
。 如果启用此选项,该地址将被解压缩到 192.0.2.1
。 默认为禁用。 仅当 protocol
设置为 'both'
时才能使用。
如果允许空值,则必须允许空值,因为空值存储为空值。
JSONField
- class JSONField(encoder=None, decoder=None, **options)
用于存储 JSON 编码数据的字段。 在 Python 中,数据以其 Python 原生格式表示:字典、列表、字符串、数字、布尔值和 None
。
JSONField
支持 MariaDB 10.2.7+、MySQL 5.7.8+、Oracle、PostgreSQL 和 SQLite(启用了 JSON1 扩展)。
- JSONField.encoder
一个可选的 json.JSONEncoder
子类,用于序列化标准 JSON 序列化器不支持的数据类型(例如 datetime.datetime
或 UUID
)。 例如,您可以使用 DjangoJSONEncoder 类。
默认为 json.JSONEncoder
。
- JSONField.decoder
一个可选的 json.JSONDecoder
子类,用于反序列化从数据库中检索到的值。 该值将采用自定义编码器选择的格式(通常是字符串)。 您的反序列化可能需要考虑到您无法确定输入类型的事实。 例如,您冒着返回 datetime
的风险,该字符串实际上是一个恰好与为 datetime
选择的格式相同的字符串。
默认为 json.JSONDecoder
。
如果给字段一个 default,请确保它是一个不可变对象,例如 str
,或每次返回一个新的可变对象的可调用对象,例如 dict
] 或函数。 提供一个可变的默认对象,如 default={}
或 default=[]
在所有模型实例之间共享一个对象。
在数据库中查询JSONField
,参见查询JSONField。
PostgreSQL 用户
PostgreSQL 有两种基于 JSON 的原生数据类型:json
和 jsonb
。 它们之间的主要区别在于它们的存储方式和查询方式。 PostgreSQL 的 json
字段存储为 JSON 的原始字符串表示形式,并且必须在基于键查询时即时解码。 jsonb
字段基于允许索引的 JSON 的实际结构进行存储。 权衡是写入 jsonb
字段的少量额外成本。 JSONField
使用 jsonb
。
甲骨文用户
Oracle 数据库不支持存储 JSON 标量值。 仅支持 JSON 对象和数组(在 Python 中使用 dict
和 list
表示)。
NullBooleanField
- class NullBooleanField(**options)
像 BooleanField 和 null=True
。
自 3.1 版起已弃用:NullBooleanField
已弃用,取而代之的是 BooleanField(null=True)
。
PositiveBigIntegerField
- class PositiveBigIntegerField(**options)
像 PositiveIntegerField,但只允许某个(依赖于数据库的)点下的值。 从 0
到 9223372036854775807
的值在 Django 支持的所有数据库中都是安全的。
PositiveIntegerField
- class PositiveIntegerField(**options)
类似于 IntegerField,但必须为正数或零 (0
)。 从 0
到 2147483647
的值在 Django 支持的所有数据库中都是安全的。 出于向后兼容性的原因,接受值 0
。
PositiveSmallIntegerField
- class PositiveSmallIntegerField(**options)
像 PositiveIntegerField,但只允许某个(依赖于数据库的)点下的值。 从 0
到 32767
的值在 Django 支持的所有数据库中都是安全的。
SmallAutoField
- class SmallAutoField(**options)
像 AutoField,但只允许在特定(依赖于数据库)限制下的值。 从 1
到 32767
的值在 Django 支持的所有数据库中都是安全的。
SmallIntegerField
- class SmallIntegerField(**options)
类似于 IntegerField,但只允许某个(依赖于数据库的)点下的值。 从 -32768
到 32767
的值在 Django 支持的所有数据库中都是安全的。
TextField
- class TextField(**options)
一个大文本字段。 此字段的默认表单小部件是 Textarea。
如果您指定 max_length
属性,它将反映在自动生成的表单字段的 Textarea 小部件中。 但是,它不会在模型或数据库级别强制执行。 为此使用 CharField。
- TextField.db_collation
-
字段的数据库排序规则名称。
笔记
排序规则名称未标准化。 因此,这将无法跨多个数据库后端移植。
甲骨文
Oracle 不支持 TextField
的排序规则。
TimeField
- class TimeField(auto_now=False, auto_now_add=False, **options)
时间,在 Python 中由 datetime.time
实例表示。 接受与 DateField 相同的自动填充选项。
此字段的默认表单小部件是 TimeInput。 管理员添加了一些 JavaScript 快捷方式。