django Model field

澹台展鹏
2023-12-01

字段选项

通用参数

下面的参数是通用的,适合所有的字段类型。

blank

  • 如果设置为 True ,该字段允许为空。默认为 False

  • 需要注意的是它和null的区别,null是数据库层的参数,然而blank是校验层的参数,如果一个字段设置了blank=True 类型属性检查时候允许为空值,如果一个字段设置blank=False,那么字段必须有值。

null

  • 如果设置为 True , 当该字段为空时,Django会将数据库中该字段设置为 NULL 。默认为 False

  • 避免在字符类的字段(例如 CharFieldTextField)使用null。如果字符类的字段具有null=True属性,那么意味它有2种"no data"可能性:NULLthe empty string ,在大多数情况下,"no data"具有2层含义是不合适的, Django 一般会使用the empty string 而不是NULL.在一个字段同时具有 unique=Trueblank=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

  • DateFieldDateTimeField设置该属性确保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.
 类似资料:

相关阅读

相关文章

相关问答