django-restframework中的serializer处理的作用

django中可以通过多个serializer创建不同的数据库数据处理模型
LIST时:
可以对返回的数据进行加工、装饰

class ManageDeliveryDetailSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    dn = PLDeliveryinsSerializer()
    class Meta:
        model = DeliveryDetail
        fields = '__all__'

dn是一个外键,可以通过serializer实例化,返回后会得到一个具体的dn实例
也可以通过在model中定义方法后再serializer中的重写to_representation函数并调用model中的方法来对传输的数据进行处理

model.py中定义
class Example:
exa = model.CharField()
def foo(self):
pass

serializer.py中调用
class ExampleSerializer(serializer.ModelSerializer):
class Meta:
model = Example
fields = ‘all

    def to_representation(self, obj):
	        data = super(BatchProductSerializer, self).to_representation(obj)
	      	exa = obj.foo()
	        data['exa'] = exa
	        return data

POST时:
可以对POST过来的数据进行验证等操作
如在serializer中定义一个
username = serializers.CharField(required=True, allow_blank=False, label=‘用户名’,
validators=[UniqueValidator(queryset=User.objects.all(), message=‘用戶已存在’)])
则在前端传输数据过来的过程中会对username字段进行一个唯一性验证,如果不唯一则返回用户名已存在

如果在同一个ViewSet中会使用到不同的serializer类可以在view.py中动态定义不同HTTP请求类型的serializer类

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return ...Serializer
        elif self.action == 'create':
            return ...Serializer
        return ...Serializer

PS:当fields = 'all’时默认会将serializer中创建的所有的新字段以及原有model中的所有字段返回

你可能感兴趣的:(django系统开发笔记)