例如,我有两个模型: Model1Model2 。它们在模型级别上没有任何关键字段直接相关。对于这两种模型,我都有序列化程序。我正在寻找在 Model2 序列化程序中设置 Model1 查询集的方法。例如:

GET /api/model1/01

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

最佳答案

解决方案 1:在 Model2Serializer Model1 中使用 SerializerMethodField()
在这个方法中,我们在 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 :我知道这些解决方案并不干净。如果这两个模型相关联,我们本可以用更简洁的方式来解决这个问题。

10-06 03:29