下面的参数是通用的,适合所有的字段类型。
如果设置为 True
,该字段允许为空。默认为 False
。
需要注意的是它和null
的区别,null
是数据库层的参数,然而blank
是校验层的参数,如果一个字段设置了blank=True
类型属性检查时候允许为空值,如果一个字段设置blank=False
,那么字段必须有值。
如果设置为 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
参数是数据库层参数.
该参数接收一个可迭代的列表或元组(基本单位为二元组)(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'
True
, 将为此字段创建数据库索引。字段的默认值. 可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象。
默认值不可以是可变类型的(model instance, list, set, etc.)。
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
admin
或者其他的model模块. 同样也会在model校验的时候跳过,默认Truehelp_text="Please use the following format: <em>YYYY-MM-DD</em>."
主键,在一个模型中,如果你没有对任何一个字段设置 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 自动设置)。
DateField
和 DateTimeField
设置该属性确保date的唯一性#备注名为 "person's first name"
first_name = models.CharField("person's first name", max_length=30)
#备注名为 "first name"
first_name = models.CharField(max_length=30)
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])