解决方案1:使用Model2Serializer
in a Model1
's SerializerMethodField() http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
在这个方法中,我们定义了一个model2_data
SerializerMethodField()
领域中的Model1Serializer
。在那里,我们将首先获取所有Model2
使用当前的对象Model1
目的。然后我们初始化Model2Serializer
with 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
method
另一种选择是覆盖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:我知道这些解决方案并不干净。如果这两个模型是相关的,我们就可以以更简洁的方式解决这个问题。