支持动态指定字段的序列化器,传参fields,序列化和反序列化都支持

本文介绍了如何在Django中创建一个可复用的`DynamicFieldsMixin`类,用于序列化器,支持动态指定字段进行序列化和反序列化。该类在初始化时会根据提供的`fields`参数过滤不需要的字段,而在`__new__`方法中处理`many=True`的情况,根据`list_fields`设置序列化字段。示例中展示了`BudgetSerializer`类的使用,以及在视图中如何调用该序列化器处理分页数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义一个可复用的mixin类:

class DynamicFieldsMinxin:
    """支持动态指定字段的序列化器,传参fields,序列化和反序列化都支持"""
    Meta: type

    def __init__(self, *args, **kwargs):
        """支持字段动态生成的序列化器,从默认的Meta.fields中过滤,无关字段不查不序列化"""
        fields = kwargs.pop('fields', None)
        super().__init__(*args, **kwargs)
        if fields is not None:
            allow = set(fields)
            existing = set(self.fields)
            for f in existing - allow:
                self.fields.pop(f)

    def __new__(cls, *args, **kwargs):
        """list序列化时,首先使用传参的fields,默认用meta.list_fields作为序列化字段"""
        if kwargs.pop('many', False):
            fields = getattr(cls.Meta, 'list_fields', None)
            if fields and 'fields' not in kwargs:
                kwargs['fields'] = fields
            return cls.many_init(*args, **kwargs)
        return super().__new__(cls, *args, **kwargs)

序列化器直接继承:

class BudgetSerializer(DynamicFieldsMinxin, serializers.ModelSerializer):
    
    class Meta:
        fields = "__all__"
        model = models.Budget

使用:

serializer = self.get_serializer(page, many=True, fields=['id'])

在代码种体现如下:

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True, fields=['id'])
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值