模型類序列化器
阿新 • • 發佈:2018-11-10
模型類序列化器
- DRF提供了模型類序列化器:
ModelSerializer
- 作用: 簡化對應django模型類的序列化器的定義
ModelSerializer與常規的Serializer相同,但提供了:
- 基於模型類自動生成一系列欄位
- 基於模型類自動為 Serializer 生成 validators,比如欄位唯一的校驗器
- 包含預設的 create() 和 update() 的實現
1. 定義
比如我們建立一個 DepartmentSerializer2
classDepartmentSerializer2(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
屬性:指定序列化器中包含哪些欄位,如下:
classDepartmentSerializer2(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())