Django - 模型 1. 字段选项

参考文献:Django 字段API

字段选项

null

Field.null: 如果为真,Django将在数据库中将空值存储为NULL,默认False。避免在基于字符串的字段(如CharField和TextField)上使用null。如果一个基于字符串的字段有null=True,这意味着它对于“无数据”有两个可能的值:null和空字符串。在大多数情况下,为“no data”设置两个可能的值是多余的;Django约定是使用空字符串,而不是NULL。一个例外是当CharField同时具有unique=True和blank=True集时。在这种情况下,当保存多个具有空值的对象时,需要null=True来避免惟一约束冲突。对于基于字符串和非基于字符串的字段,如果希望允许表单中的空值,还需要设置blank=True,因为null参数只影响数据库存储(参见blank)。

注解:当使用Oracle数据库后端时,NULL值将被存储,以表示空字符串,而与此属性无关。

blank

Field.blank: 如果为True,则允许字段为空,默认False。注意,这与null不同。null纯粹与数据库相关,而blank则与验证相关。如果字段为blank=True,表单验证将允许输入空值。如果一个字段有blank=False,则需要该字段。

chioces

Field.choices: 一个可迭代的(例如,一个列表或元组),由恰好两个条目(例如[(a, B), (a, B)…])的迭代组成,作为该字段的选择。如果给出了选项,则由模型验证强制执行,默认的表单小部件将是一个带有这些选项的选择框,而不是标准文本字段。每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。例如:

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

通常,最好在模型类中定义选项,并为每个值定义一个适当命名的常量:

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)

虽然您可以在模型类外部定义一个选择列表,然后引用它,但是在模型类内部为每个选择定义选择和名称会保留使用它的类的所有信息,并使这些选择易于引用(例如,STUDENT.SOPHOMORE将在引入学生模型的任何地方工作)。

您还可以将可用的选择收集到可用于组织目的的命名组中:

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

元组中第一个元素被用于组名,第二个元素是可迭代的2-tuples,每个2-tuple包含一个实际值和一个可读值。分组选项可以与单个列表中的未分组选项组合(例如本例中的unknown选项)。

对于设置了choices的每个模型字段,Django将添加一个方法来检索该字段当前值的可读名称。参见数据库API文档中的get_FOO_display()。

注意,选项可以是任何可迭代对象——不一定是列表或元组。这使您可以动态地构建选择。但是,如果您发现自己的修改选项是动态的,那么最好使用带有foreign键的适当数据库表。选择是针对静态数据的,这些数据即使有变化,也不会有太大的变化。

除非在字段中设置了blank=False和默认值,否则在选择框中将呈现一个包含“---------”的标签。要覆盖此行为,请向不包含None的选项添加一个元组;e.g:(None,“Your String For Display”)。或者,您可以在有意义的地方使用空字符串而不是None,例如在CharField上。

db_column

Field.db_column: 用于此字段的数据库列的名称。如果没有指定,Django将使用字段的名称。如果数据库列名是SQL保留字,或者包含Python变量名中不允许的字符(特别是连字符),则没问题。Django在幕后引用列和表的名称。

db_index

Field.db_index: 如果为True,将为此字段创建一个数据库索引。

db_tablespace

Field.db_tablespace: 如果索引了该字段,那么数据库表空间的名字被用来索引该字段。(没怎么看懂这段英文原文:The name of the database tablespace to use for this field's index, if this field is indexed. )。默认值是项目的DEFAULT_INDEX_TABLESPACE设置(如果设置的话),或者模型的db_tablespace设置(如果设置的话)。如果后端不支持索引的表空间,则忽略此选项。

default

Field.default: 字段的默认值。这可以是一个值或一个可调用对象。如果是可调用的,它将在每次创建新对象时被调用。默认值不能是可变对象(模型实例、列表、集合等),作为对该对象的相同实例的引用,将在所有新模型实例中用作默认值。相反,将所需的默认值包装在可调用的函数中。例如,如果您想为JSONField指定默认的dict,可以使用以下函数:

def contact_default():
    return {"email": "[email protected]"}

contact_info = JSONField("ContactInfo", default=contact_default)

lambdas不能用于像default这样的字段选项,因为它们不能被迁移序列化。有关其他注意事项,请参见该文档。

对于像ForeignKey这样映射到模型实例的字段,默认值应该是它们引用的字段的值(pk,除非设置了to_field),而不是模型实例。

当创建新模型实例而没有为字段提供值时,将使用默认值。当字段是主键时,当字段设置为None时也使用默认值。

editable

Field.editable: 如果为False,该字段将不会显示在admin或任何其他模型中,在模型验证期间也会跳过它们,默认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特殊字符。确保转义来自可信用户的帮助文本,以避免跨站点脚本攻击。

primary_key

Field.primary_key: 如果为True,该字段为模型主键。如果您没有为模型中的任何字段指定primary_key=True, Django将自动添加一个AutoField来保存主键,因此您不需要在任何字段上设置primary_key=True,除非您希望覆盖默认的主键行为。更多,请看自动设置主键。primary_key=True意味着null=False和unique=True。对象上只允许有一个主键。主键字段是只读的。如果您更改现有对象上的主键值,然后将其保存,那么将在旧对象的旁边创建一个新对象。

unique

Field.unique: 如果为True,则此字段在整个表中必须是惟一的。这是通过数据库级和模型验证实现的。如果您试图在惟一的字段中保存具有重复值的模型,则django.db.IntegrityError将在模型的save()方法时引起。此选项对除ManyToManyField和OneToOneField之外的所有字段类型都有效。注意,当unique为True时,不需要指定db_index,因为unique表示创建索引。

unique_for_date

Field.unique_for_date: 将字段类型为DateField和DateTimeField的unique_for_date设置后需要日期字段唯一。例如,如果您有一个字段标题unique_for_date="pub_date",那么Django将不允许具有相同标题和pub_date的两条记录的条目。注意,如果将其设置为指向DateTimeField,则只考虑该字段的日期部分。另外,当USE_TZ为True时,将在保存对象时的当前时区执行检查。这是由Model .validate_unique()在模型验证期间强制执行的,但不是在数据库级别。如果任何unique_for_date约束包含不属于模型形式的字段(例如,如果其中一个字段在exclude中列出或者editable=False中),Model.validate_unique()将跳过对该特定约束的验证。

unique_for_month

Field.unique_for_month: 类似unique_for_date,但是要求字段对于月份是唯一的。

unique_for_year

Field.unique_for_year: 类似unique_for_month和unique_for_data。

verbose_name

Field.verbose_name: 字段的可读名称。如果没有给出详细名称,Django将使用字段的属性名自动创建它,将下划线转换为空格,参见详细字段名称

validators

Field.validators: 为该字段运行的验证器列表。有关更多信息,请参见验证器文档

字段实现查找注册API。该API可用于自定义字段类可用的查找以及如何从字段中获取查找。

猜你喜欢

转载自blog.csdn.net/obf13/article/details/88168045