下列参数对所有字段类型都是有效的,同时这些参数也是可选的。

null

Field.null

如果为 True ,Django 就会将空值(empty)存储为数据库中的 NULL 。默认值是 False。

要注意空字符串(empty string)总是被存储为空字符串,而不是 NULL。 null=True 只对非字符串字段有意义,比如整数(integer),布尔值(boolean),日期(dates)。如果你允许表单提交空值,无论是哪种字段,你还要再设置 blank=True ,这是因为 null 仅仅影响数据库存储 (详见 blank)。

除非你有很充分的理由,否则不要在字符串字段(比如CharField 和 TextField)上使用 null 。在字符串字段上声明 null=True ,就意味着有两种意义的空值:NULL,和空字符串(empty string)。大多数情况下,存在两种空值是多余的。Django 按惯例是使用空字符串,而非 NULL 。

注意

在使用 Oracle 数据库时,null=True 选项将被强加到有可能是空值的字符串字段,而且会在数据库中保存 NULL ,来表示空字符串。

blank

Field.blank

如果为 True,字段允许不填。默认为 False 。

要注意该选项与 null 不同。 null 纯粹是数据库范畴的概念,而 blank 是数据验证范畴的。如果某个字段声明了 blank=True,那么 Django 的管理后台就允许该字段填写空值;否则,如果声明为 blank=False,该字段就是必填的。

choices

Field.choices

它是一个可迭代的二元组(比如,列表或是元组),用来给字段提供选择项。

如果设置了 choices ,Django 的管理后台就会显示选择框,而不是标准的文本框,而且这个选择框的选项就是 choices 中的元组。

这是一个 choices 列表的例子:

YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)

每个元组中的第一个元素,是存储在数据库中的值;第二个元素是该选项更易理解的描述。

choices 列表可以定义为 model 类的一部分:

class Foo(models.Model):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

也可以定义在 model 类之外:

GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
class Foo(models.Model):
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

你也可以将 choices 整理成命名组,这样代码更有条理,结构更清晰:

MEDIA_CHOICES = (
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
)

每个元组中的第一个元素会用做组的命名。第二个元素是一个可迭代的二元组,每个二元组都包含一个一个值和一个易于理解的描述。分组选项可以和未分组选项组合在一个单独的列表当中(比如上例中的 unknown 项)。

Djanog 会对设置了 choices 的字段添加一个方法。这个方法根据该字段的当前值获取它易于理解的描述。详见数据库 API 文档中的 get_FOO_display() 。

最后注意一点,choices 可以是任何可迭代的对象,并不仅仅只是列表或是元组。这意味着你可以构造动态的 choices ,不过你最好通过 ForeignKey 使用一张适合的数据表来构造动态 choices。毕竟 choices 适用于变动不大的静态数据。

db_column

Field.db_column

该字段在数据库中所使用的列名称。如果没有声明,Django 就会以该字段的名称做为列名。

列名称可以是 SQL 保留字,也可以包含不允许出现在 Python 变量名的特殊字符,比如连字符。这是因为 Django 会在幕后给列名和表名加上引号。

db_index

Field.db_index

如果为 True,运行 django-admin.py sqlindexes <sqlindexes> 会为该字段输出一条 CREATE INDEX 语句。

db_tablespace

Field.db_tablespace

这部分是在 Django 1.0 新增的: 请查看版本文档

如果该字段是索引字段,db_tablespace 就表示该索引所在的数据库表空间的名称。如果项目配置文件中设定了 DEFAULT_INDEX_TABLESPACE ,那么默认值就是配置项的值;如果你指定了该 model 中 Meta 内嵌类的 db_tablespace ,那么默认值就是 Meta 中 db_tablespace 的值。如果数据库不支持表空间,就会忽略该选项。

default

Field.default

该字段的默认值。它可以是一个值,也可以是一个可调用的对象(这里称之为对象C)。若是后者,那么每次创建一个新对象时,对象C都将被调用。

editable

Field.editable

如果为 False ,那么在 Django 管理后台中就不会编辑该字段;同样,在 Django 自动生成的表单中也不会编辑该字段。默认值是 True 。

help_text

Field.help_text

附加的提示信息。在管理后台编辑该对象的表单中,它显示在该字段下面。即使你的对象无须在后台管理,对于文档化也是很用的。

注意,在管理后台显示该提示信息时,并不会对其转义。所以你可以在 help_text 中包含 HTML 。例如:

help_text="Please use the following format: <em>YYYY-MM-DD</em>."

你也可以使用纯文本,还可以用 django.utils.html.escape() 转义任何 HTML 字符。

primary_key

Field.primary_key

如果为 True,那么该字段就是 model 的主键。

如果你没有指定任何一个字段的 primary_key=True ,Django 就会自动添加一个 IntegerField 做为主键字段。所以除非你想重写默认的主键行为,否则没必要在任何字段上设置 primary_key=True。详见 自增主键字段 (Automatic primary key fields) 。

primary_key=True 意味着 null=False 和 unique=True 。一个对象只能有一个主键。

unique

Field.unique

如果为 True,该字段值就必须是全表唯一的。

它同时作用于数据库层级以及 Django 的管理后台和表单层级。如果你保存 model 时,某个 unique 字段的值是重复的,那么 save() 方法就会抛出 django.db.IntegrityError 异常。

这个选项在所有的字段上都是可用的,除了 ManyToManyField 和 FileField 以外。

unique_for_date

Field.unique_for_date

如果要求在某个日期内,该字段值在数据表中是唯一的(就不存在时期和字段值都相同的记录),那就可以将 unique_for_date 设置为某个 DateField 或 DateTimeField 的名称。

例如,假设你有一个声明了 unique_for_date="pub_date" 的 title 字段,那么 Django 就不会允许出现 title 和 pub_date 相同的两条记录。

它作用于 Django 的管理后台和表单层级,而非数据库层级。

unique_for_month

Field.unique_for_month

和 unique_for_date 相似,只不过限定的是月分。

unique_for_year

Field.unique_for_year

和 unique_for_date, unique_for_month 相似,只不过限定的是年分。

verbose_name

Field.verbose_name

该字段易于理解的名称。如果没有提供自述名,Django 会根据字段的属性名自动创建自述名--就是将属性名称中的空格替换成下划线。