nap*_*nik 5 django-rest-framework
例如,我有两个模型:Model1和Model2.它们与模型级别的任何关键字段无直接关系.对于这两种型号,我都有序列化器.我正在搜索序列化程序中的Model2queryset 的方式Model1.例如:
GET /api/model1/01
Run Code Online (Sandbox Code Playgroud)
根据Model1请求中的ID,我可以查询Model2我需要响应的对象.现在我有一个我不喜欢的解决方案:在Model1序列化器中我有方法字段,它返回一个对象列表.有没有办法Model2在Serializer1的方法字段或我的案例的任何其他解决方案中使用串行器?
解决方法1:使用Model2Serializer中Model1的SerializerMethodField()
在这个方法中,我们定义了一个model2_data SerializerMethodField()字段Model1Serializer.在那里,我们将首先Model2使用当前Model1对象获取所有对象.然后我们初始化Model2Serializerwith 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
Run Code Online (Sandbox Code Playgroud)
解决方案-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)
Run Code Online (Sandbox Code Playgroud)
PS:我知道这些解决方案并不干净.如果两个模型相关,我们可以以更清洁的方式解决问题.
| 归档时间: |
|
| 查看次数: |
3479 次 |
| 最近记录: |