【问题标题】:Different serializers for different instances in a queryset in Django Rest FrameworkDjango Rest Framework中查询集中不同实例的不同序列化程序
【发布时间】:2018-05-18 05:02:10
【问题描述】:

generics.GenericAPIView 中,重写get_serializer_class() 方法只会为整个查询集动态选择一个序列化程序。有没有办法根据对象的某些属性值将不同的序列化程序应用于同一查询集中的不同对象?提前致谢!

【问题讨论】:

  • 是的,这是完全有可能的,虽然不是在get_serializer_class - 其他地方,也不是一个好主意。您能否详细说明您希望实现的目标,因为拥有不同的 API 响应格式不是一个好习惯。统一是有用的。您能否更详细地描述两个不同序列化程序的用例?
  • 是的。例如,我有 5 种不同类型的通知。由于我想按时间对它们进行排序,出于效率原因,我将它们存储在同一个模型中,它们由ntype 属性来区分。查询集是按时间排序的不同类型通知的列表,我想将不同的序列化程序应用于不同的类型,因为我要返回的每种类型都有额外的属性。
  • 您可以订阅 get_seriakizer 函数,以便根据某些字段或方法提供正确的序列化。
  • 为什么不使用基于ntype 获得正确值的单个序列化方法字段?请参阅下面的答案,了解如何实现这一目标!

标签: django django-rest-framework django-serializer


【解决方案1】:

您可以使用“调度程序”序列化程序,它将使用特定于类型的序列化程序。请注意,在这种情况下,特定类型的数据将显示为 typeSpecificData 字段。

class Type1Serializer(serializers.ModelSerializer):
    ...


class Type2Serializer(serializers.ModelSerializer):
    ...


class MySerializer(serializers.ModelSerializer):
    typeSpecificData = serializers.SerializerMethodField()

    def get_typeSpecificData(self, instance):
        if instance.type == 'type1':
            serializer = Type1Serializer
        else:
            serializer = Type2Serializer


        return serializer(instance).data

然后您只需在视图中使用MySerializer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 2020-05-23
    • 2014-02-09
    • 2021-07-30
    • 2021-03-17
    • 2018-06-23
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多