django Model field
字段选项
通用参数
下面的参数是通用的,适合所有的字段类型。
blank
-
如果设置为
True
,该字段允许为空。默认为False
。 -
需要注意的是它和
null
的区别,null
是数据库层的参数,然而blank
是校验层的参数,如果一个字段设置了blank=True
类型属性检查时候允许为空值,如果一个字段设置blank=False
,那么字段必须有值。
null
-
如果设置为
True
, 当该字段为空时,Django
会将数据库中该字段设置为NULL
。默认为False
。 -
避免在字符类的字段(例如
CharField
和TextField
)使用null
。如果字符类的字段具有null=True
属性,那么意味它有2种"no data"
可能性:NULL
和the empty string
,在大多数情况下,"no data"
具有2层含义是不合适的, Django 一般会使用the empty string
而不是NULL
.在一个字段同时具有unique=True
和blank=True
属性的特例情况下,null=True
需要被设置,以免在存储多个空值字段的时候的唯一性限制失败。 -
对字符类的字段 和 非字符类的字段, 如果你想允许空值,你也需要设置
blank=True
, 因为null
参数是数据库层参数.
choices
-
该参数接收一个可迭代的列表或元组(基本单位为二元组)(e.g. [(A, B), (A, B) …]) . 如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。
-
元组的首元素是model需要设置的值(储存在数据库中), 第二个元素仅用于表示人工可读性的含义:
YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), )
-
一般来讲, 最好在model 类中定义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)
-
对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用
get_FOO_display()
方法。例如:from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
db_column
- 这个属性用于指明对应的数据库字段名称. 如果不设置,Django默认会使用字段名称.
db_index
- 如果设置为
True
, 将为此字段创建数据库索引。
db_tablespace
- 如果该字段被索引,则用于该字段索引的数据库表空间的名称。默认是settings里的DEFAULT_INDEX_TABLESPACE 。如果后端不支持索引的表空间,则忽略此选项。
default
-
字段的默认值. 可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象。
-
默认值不可以是可变类型的(model instance, list, set, etc.)。
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
editable
- 如果设置为False, 字段不会被展示在
admin
或者其他的model模块. 同样也会在model校验的时候跳过,默认True
error_messages
- error_messages 参数可以重写字段的提示信息。
help_text
- 字段的帮助信息。
help_text="Please use the following format: <em>YYYY-MM-DD</em>."
primary_key
-
主键,在一个模型中,如果你没有对任何一个字段设置
primary_key=True
选项。 Django 会自动添加一个 IntegerField 字段,用于设置为主键,因此除非你想重写Django
默认的主键设置行为,你可以不手动设置主键。 -
primary_key=True
意味着null=False and unique=True
. 主键具有唯一性 -
主键字段是只可读的,如果你修改一个模型实例该字段的值并保存,你将等同于创建了一个新的模型实例。例如:
from django.db import models class Fruit(models.Model): name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple') >>> fruit.name = 'Pear' >>> fruit.save() >>> Fruit.objects.values_list('name', flat=True) <QuerySet ['Apple', 'Pear']>
自动设置主键
-
默认情况下, Django 会给每一个模型添加下面的字段:
#这是一个自增的主键 id = models.AutoField(primary_key=True)
-
如果你想指定设置为为主键的字段, 在你想要设置为主键的字段上设置 primary_key=True 选项。如果 Django 看到你显式的设置了 Field.primary_key ,将不会自动在表(模型)中添加 id 列。
-
每个模型都需要拥有一个设置了 primary_key=True 的字段(无论是显式的设置还是 Django 自动设置)。
unique
- 唯一性
unique_for_date
DateField
和DateTimeField
设置该属性确保date的唯一性
unique_for_month
- Like unique_for_date, but requires the field to be unique with respect to the month.
unique_for_year
- Like unique_for_date and unique_for_month.
verbose_name
- 备注名,如果未指定该参数值, Django 会自动使用该字段的属性名作为该参数值,并且把下划线转换为空格。
#备注名为 "person's first name" first_name = models.CharField("person's first name", max_length=30)
#备注名为 "first name" first_name = models.CharField(max_length=30)
validators
- 字段校验,详见传送门
from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ def validate_even(value): if value % 2 != 0: raise ValidationError( _('%(value)s is not an even number'), params={'value': value}, )
from django.db import models class MyModel(models.Model): even_field = models.IntegerField(validators=[validate_even])
Registering and fetching lookups
- Field implements the lookup registration API. The API can be used to customize which lookups are available for a field class, and how lookups are fetched from a field.