2016-06-09 86 views
4

例如,我有两个型号:Model1Model2。它们与模型层面上的任何关键字段不直接相关。对于这两个模型我有序列化器。我正在寻找在Model1序列化程序中有Model2 queryset的方式。例如:序列化方法场内Django的REST框架

GET /api/model1/01 

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

回答

5

解-1:在一个Model1SerializerMethodField()

在该方法中使用Model2Serializer,我们在Model1Serializer限定model2_dataSerializerMethodField()字段。在那里,我们将首先使用当前的Model1对象获取所有的Model2对象。然后我们用many=True参数初始化Model2Serializer并通过所有获得的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:我知道这些解决方案是不干净。如果这两个模型相关,我们可以用更清晰的方式来解决这个问题。

+1

谢谢!我实现了第一个选项,似乎这就是我正在寻找的。 – napilnik

相关问题