在Django REST框架中序列化方法字段 [英] Serializing inside method field in Django REST framework
问题描述
例如,我有两个模型: Model1
和 Model2
。它们与模型级别上的任何关键字段不直接与每个对方相关。对于这两种型号,我都有串行器。我正在搜索在 Model1
序列化程序中的 Model2
queryset的方式。例如:
For example, I have two models: Model1
and Model2
. They are not related directly to each-other by any key-field on a model level. For both models I have serializers. I am searching the way to have Model2
queryset in Model1
serializer. For example:
GET /api/model1/01
根据请求中的 Model1
ID可以查询 Model2
我需要发送的对象。现在我有一个我不喜欢的解决方案:在 Model1
serializer我有方法字段返回一个对象列表。有没有办法在Serializer1的方法字段或任何其他解决方案中使用 Model2
serializer?
According to Model1
ID in request I can make query for Model2
objects that I need to be sent in response. For now I have solution that I don't like: in Model1
serializer I have method field that returns a list of objects. Is there any way to use Model2
serializer in method field of Serializer1 or any other solution for my case?
推荐答案
解决方案-1:使用 Model2Serializer
在 Model1
a href =http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield =nofollow> SerializerMethodField()
Solution-1: Using Model2Serializer
in a Model1
's SerializerMethodField()
在此方法中,我们定义了一个 model2_data
SerializerMethodField ()
字段在 Model1Serializer
中。在那里,我们将首先使用当前的 Model1
对象获取所有 Model2
对象。然后我们用 many = True
参数初始化 Model2Serializer
,并将所有获得的 Model2
实例。要返回 Model2
对象的序列化表示,我们访问 .data
属性。
In this method, we define a model2_data
SerializerMethodField()
field in the Model1Serializer
. There, we will first fetch all the Model2
objects using the current Model1
object. Then we initialize the Model2Serializer
with many=True
argument and pass all the obtained Model2
instances. To return the serialized representation of Model2
objects, we access the .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 :覆盖检索
方法
Solution-2: Overriding the retrieve
method
另一个选项是覆盖检索
方法,并将 model2_data
添加到您的回应以及原始回复。
Another option is to override the retrieve
method and add the model2_data
to your response along with original response.
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 :我知道这些解决方案不是清洁。如果这两个模型有关系,我们可以以更清洁的方式解决问题。
PS: I know these solutions are not clean. Had the two models been related, we could have approached the problem in a more cleaner way.
这篇关于在Django REST框架中序列化方法字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!