解-1:在一個Model1
的SerializerMethodField()
在該方法中使用Model2Serializer
,我們在Model1Serializer
限定model2_data
SerializerMethodField()
字段。在那裏,我們將首先使用當前的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:我知道這些解決方案是不乾淨。如果這兩個模型相關,我們可以用更清晰的方式來解決這個問題。
謝謝!我實現了第一個選項,似乎這就是我正在尋找的。 – napilnik