在 Django REST 框架中序列化内部方法字段

2024-04-19

例如,我有两个模型:Model1 and Model2。它们在模型级别上不通过任何关键字段直接相互关联。对于这两种模型,我都有序列化器。我正在寻找拥有的方式Model2查询集在Model1序列化器。例如:

GET /api/model1/01

根据Model1请求中的ID我可以查询Model2我需要发送响应的对象。现在我有一个我不喜欢的解决方案:Model1序列化程序我有返回对象列表的方法字段。有什么办法可以使用吗Model2Serializer1 方法字段中的序列化器或适合我的情况的任何其他解决方案?


解决方案1:使用Model2Serializer in a Model1's SerializerMethodField() http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

在这个方法中,我们定义了一个model2_data SerializerMethodField()领域中的Model1Serializer。在那里,我们将首先获取所有Model2使用当前的对象Model1目的。然后我们初始化Model2Serializer with many=True参数并传递所有获得的Model2实例。返回序列化表示Model2对象,我们访问.data财产。

class Model1Serializer(serializers.ModelSerializer):

    model2_data = serializers.SerializerMethodField() # define separate field

    class Meta:
        model = Model1
        fields = [.., 'model2_data']

    def get_model2_data(self, obj):
        # here write the logic to get the 'Model2' objects using 'obj'

        # initialize the 'Model2Serializer'
        model2_serializer = Model2Serializer(model2_objs, many=True)

        # return the serialized representation of 'Model2' objs
        return model2_serializer.data

解决方案 2:覆盖retrieve method

另一种选择是覆盖retrieve方法并添加model2_data您的回复以及原始回复。

class MyView(generics.RetrieveAPIView):

    serializer_class = Model1Serializer

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)

        # get the original serialized data
        serialized_data = serializer.data

        # get the 'Model2' objects using 'serializer.instance'
        model2_serializer = Model2Serializer(model2_objs, many=True)
        model2_data = model2_serializer.data

        # add the serialized representation of `Model2` objs
        serialized_data['model2_data'] = model2_data

        return Response(serialized_data)

PS:我知道这些解决方案并不干净。如果这两个模型是相关的,我们就可以以更简洁的方式解决这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django REST 框架中序列化内部方法字段 的相关文章

随机推荐