gpt4 book ai didi

django-rest-framework - 在 Django REST 框架中序列化内部方法字段

转载 作者:行者123 更新时间:2023-12-04 18:03:26 25 4
gpt4 key购买 nike

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

GET /api/model1/01

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

最佳答案

解决方案 1:使用 Model2SerializerModel1 SerializerMethodField()

在这个方法中,我们定义了一个 model2_data SerializerMethodField() Model1Serializer 中的字段.在那里,我们将首先获取所有 Model2对象使用当前 Model1目的。然后我们初始化Model2Serializermany=True参数并传递所有获得的 Model2实例。返回 Model2 的序列化表示对象,我们访问 .data属性(property)。

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

关于django-rest-framework - 在 Django REST 框架中序列化内部方法字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com