1. 程式人生 > >模型類序列化器

模型類序列化器

模型類序列化器

  1. DRF提供了模型類序列化器: ModelSerializer
  2. 作用: 簡化對應django模型類的序列化器的定義

ModelSerializer與常規的Serializer相同,但提供了:

  • 基於模型類自動生成一系列欄位
  • 基於模型類自動為 Serializer 生成 validators,比如欄位唯一的校驗器
  • 包含預設的 create() 和 update() 的實現

 

1. 定義

比如我們建立一個 DepartmentSerializer2

class
DepartmentSerializer2(serializers.ModelSerializer): class Meta: model = Department fields = '__all__' # 包含模型類中所有的欄位
  • model 指明參照哪個模型類
  • fields 指定序列化器中的屬性有哪些 (可以是模型類中的欄位,也可以模型類中沒有的但需要校驗的屬性,比如類似:簡訊驗證碼,確認密碼)

python console 互動環境中,檢視生成的序列化器

>>> s = DepartmentSerializer2()
>>> s DepartmentSerializer2(): id = IntegerField(label='ID', read_only=True) name = CharField(label='部門名稱', max_length=20) create_date = DateField(label='成立時間') is_delete = BooleanField(label='是否刪除', required=False)

 

2. 指定欄位

1) fields屬性:指定序列化器中包含哪些欄位,如下:

class
DepartmentSerializer2(serializers.ModelSerializer): class Meta: model = Department fields = ('id', 'name')

 

2) exclude屬性:排除掉模型類中指定的欄位

class DepartmentSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Department
        exclude = ('is_delete',)       # 注意:`exclude`不能與`fields`同時使用

 

3) 指明只讀欄位

可以通過 read_only_fields 指明只讀欄位,即 僅用於序列化輸出,在反序列化時不會進行校驗和修改

class DepartmentSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Department
        fields = '__all__'
        read_only_fields = ('id', 'create_date')  # 這些欄位不能修改

 

4) 指定 關聯屬性的序列化方式

class EmployeeSerializer2(serializers.ModelSerializer): 
    # 1. 返回關聯物件的主鍵
    department = PrimaryKeyRelatedField(read_only=True)
    # 2. 返回關聯物件的字串表示(即Department類的 __str__ 方法的返回值)
    # department = StringRelatedField(read_only=True)
    # 3. 返回關聯物件序列化器定義的屬性
    # department = DepartmentSerializer(read_only=True)

    class Meta:
        model = Employee
        fields = '__all__'

class DepartmentSerializer2(serializers.ModelSerializer):
    # 名字固定: 類名小寫_set
    employee_set = PrimaryKeyRelatedField(read_only=True, many=True)
    # employee_set = StringRelatedField(read_only=True, many=True)
    # employee_set = EmployeeSerializer(read_only=True, many=True)

    class Meta:
        model = Department
        fields = '__all__'                             # ok
        # fields = ('id', 'name', 'employee_set')    # ok
        # fields = ('id', 'name')                     # error

 

3. 新增額外引數: extra_kwargs 屬性

我們可以使用extra_kwargs引數為ModelSerializer新增或修改原有的選項引數

class EmployeeSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Employee
        fields = '__all__'
        extra_kwargs = {
            'name': {'min_length': 5, 'max_length': 20},
            'age': {'min_value': 1, 'max_value': 200},
        }

# 結果如下:

EmployeeSerializer2():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(label='姓名', max_length=20, min_length=5)
    age = IntegerField(label='年齡', max_value=200, min_value=1)
    gender = ChoiceField(choices=((0, ''), (1, '')), label='性別', required=False, 
             validators=[<django.core.validators.MinValueValidator object>, 
                         <django.core.validators.MaxValueValidator object>])
    salary = DecimalField(decimal_places=2, label='工資', max_digits=8)
    comment = CharField(allow_blank=True, allow_null=True, label='備註',             
                        max_length=300, required=False)
    hire_date = DateField(label='入職時間', read_only=True)
    department = PrimaryKeyRelatedField(label='所屬部門', 
                                        queryset=Department.objects.all())