在Django REST框架

时间:2016-06-09 14:49:51

标签: django-rest-framework

例如,我有两个模型:Model1Model2。它们与模型级别的任何关键字段无直接关系。对于这两种型号,我都有序列化器。我正在寻找Model2序列化程序中Model1查询集的方式。例如:

GET /api/model1/01

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

1 个答案:

答案 0 :(得分:7)

解决方案-1:在Model2Serializer SerializerMethodField() 中使用Model1

在此方法中,我们在model2_data中定义SerializerMethodField() Model1Serializer字段。在那里,我们将首先使用当前Model2对象获取所有Model1个对象。然后我们用Model2Serializer参数初始化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方法

另一种选择是覆盖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 :我知道这些解决方案并不干净。如果两个模型相关,我们可以更清洁地解决问题。