在Django REST框架中序列化方法字段 [英] Serializing inside method field in Django REST framework

查看:194
本文介绍了在Django REST框架中序列化方法字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,我有两个模型: Model1 Model2 。它们与模型级别上的任何关键字段不直接与每个对方相关。对于这两种型号,我都有串行器。我正在搜索在 Model1 序列化程序中的 Model2 queryset的方式。例如:

For example, I have two models: Model1 and Model2. They are not related directly to each-other by any key-field on a model level. For both models I have serializers. I am searching the way to have Model2 queryset in Model1 serializer. For example:

GET /api/model1/01

根据请求中的 Model1 ID可以查询 Model2 我需要发送的对象。现在我有一个我不喜欢的解决方案:在 Model1 serializer我有方法字段返回一个对象列表。有没有办法在Serializer1的方法字段或任何其他解决方案中使用 Model2 serializer?

According to Model1 ID in request I can make query for Model2 objects that I need to be sent in response. For now I have solution that I don't like: in Model1 serializer I have method field that returns a list of objects. Is there any way to use Model2 serializer in method field of Serializer1 or any other solution for my case?

推荐答案

解决方案-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.

这篇关于在Django REST框架中序列化方法字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆