且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2021-12-16 09:58:41

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

Solution-1: Using Model2Serializer in a Model1's SerializerMethodField()

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

In this method, we define a model2_data SerializerMethodField() field in the Model1Serializer. There, we will first fetch all the Model2 objects using the current Model1 object. Then we initialize the Model2Serializer with many=True argument and pass all the obtained Model2 instances. To return the serialized representation of Model2 objects, we access the .data property.

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 :覆盖检索方法

Solution-2: Overriding the retrieve method

另一个选项是覆盖检索方法,并将 model2_data 添加到您的回应以及原始回复。

Another option is to override the retrieve method and add the model2_data to your response along with original response.

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 :我知道这些解决方案不是清洁。如果这两个模型有关系,我们可以以更清洁的方式解决问题。

PS: I know these solutions are not clean. Had the two models been related, we could have approached the problem in a more cleaner way.