首页 > 解决方案 > 如何部分使用序列化程序

问题描述

我有几个视图集,其中的几个端点使用一个序列化程序。一个端点甚至没有 Meta 类,它执行某个动作并在方法 to_representation 中使用相同的序列化程序。在这个序列化程序中,我使用这样的方法字段:

some_field = serializers.SerializerMethodField()
def get_some_field(self, obj):
    return bool(obj.something_attr)

something_attr 我在 viewset 中

 queryset =MyModel.objects.annotate(something_attr=(...))

在其他视图集中没有这样的字段,因此他们使用其他查询集。我可以在不创建一堆额外的序列化程序的情况下解决这个问题吗?我的感谢!

标签: djangoserializationdjango-rest-framework

解决方案


根据我的理解,您正在尝试使用具有不同视图的单个序列化程序类 - 但每个视图都需要不同的字段,对吗?

class DynamicFieldSerializerMixin:
    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)

        super().__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

您可以使用此 mixin 为单个序列化程序类的每个视图动态定义字段。只需将fields=[]关键字参数与字段名称列表一起传递。


推荐阅读