运维咖啡吧

享受技术带来的乐趣,体验生活给予的感动

Django Model字段选项

这里只说一些通用的字段选项,对所有字段类型都有效,且是可选的

null

用来配置字段是否允许为空,如果是True,则字段允许为空,数据库中存储空值为NULL,否则字段不允许为空,默认为False

避免在基于字符串的字段上使用null,如CharFieldTextField,如果一个基于字符串的字段有null=True,这意味着它有两种可能的无数据值,分别是NULL和空字符串。如果要设置字符串允许为空,可以通过设置default=''来实现

blank

如果是True,则允许为空,默认为False

blank与null不同的是,blank是纯验证相关的,并不会影响到数据库,而null则是与数据库相关的,如果设置了null=True,则在数据库字段上会有NOT NULL的限制,而设置了blank=True则不会修改数据库,仅仅是在Django验证表单时允许为空

choices

当字段的内容比较固定时,Choices非常有用,例如性别字段,只会有固定的几个,这时候我们可以通过CHOICES来处理

SEX_CHOICES = (
    (1, '男'),
    (2, '女'),
    (3, '保密'),
)

class User(models.Model):
    sex = models.SmallIntegerField(choices=SEX_CHOICES, verbose_name='性别')

    def to_dict(self):
        return {
            "id": self.id,
            "sex": self.get_sex_display(),
        }

通常CHOICES选项的类型为元组,元组内有嵌套了元组,嵌套的元组定义数据,嵌套元组包含了两个数据,第一个数据为值,值会记录进数据库,第二个数据为可读的选项名称,可读的选项名称不会记录进数据库

对于每一个设置了choices的模型字段,Django会添加一个方法来检索字段当前值的可读名称,用法是:get_sex_display(),其中sex为字段名称

default

配置字段的默认值,当添加新的模型实例且没有为该字段提供值时,使用默认值

default可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象

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

class User(models.Model):
    age = models.SmallIntegerField(default=18, verbose_name='年龄')
    contact_info = JSONField("ContactInfo", default=contact_default)

对于像ForeignKey这样映射到模型实例的字段,默认应该是它们引用的字段的值,而不是模型实例,ForeignKey引用字段的值默认是pk,如果设置过to_field,那引用字段字段的值将会变成to_field设置的字段值

unique

如果设置为True,这个字段必须在整张表中保持值唯一

unique=True时,不仅在模型验证时会执行唯一性验证,更会在数据库级别强制执行,如果在unique字段中保存重复的值,将会引发一个django.db.IntegrityError错误

unique=True时,无需为字段创建索引,因为unique意味着创建一个索引

unique_for_date

将其设置为DateField或DateTimeField的名称,要求该字段的日期字段值是唯一的

def Article(models.Model):
    pub_date = models.DateField(auto_now_add=True, verbose_name='发布时间')
    title = models.CharField(max_length=32, unique_for_date=pub_date, verbose_name='标题')

例如字段title有unique_for_date=pub_date配置,那么Django就不允许输入两条相同title和pub_date的记录

unique_for_month

unique_for_date类似,只是要求字段对月份是唯一的

unique_for_year

unique_for_year类似,只是要求字段对年是唯一的

verbose_name

设置字段的可读名称

primary_key

如果设置为True,则会将该字段设置为模型的主键,一个模型只允许有一个主键

默认情况下Django会添加一个ID字段来作为主键,当你有为模型下的某个字段设置primary_key=True时,则不会生成ID主键字段。通常情况下我们就使用默认的ID作为主键就好了,无需修改主键字段

db_column

配置数据库列的名称,如果没有配置db_column,则默认使用字段名作为数据库列名

db_index

如果为True,则为该字段创建数据库索引

db_tablespace

如果字段有索引,则可以通过db_tablespace来配置索引使用的数据库表空间名称,前提是数据库支持索引表空间

validators

要为该字段运行的验证器列表

editable

如果设置为False,则该字段将不会在admin或任何其他ModelForm中显示,在模型验证中也会跳过,默认为True

error_message

当字段出错时,可以通过error_message来覆盖默认引发的错误信息

help_text

字段额外的帮助文本,会随着表单空间一同展示,前提是使用了ModelForm来构建表单