2016-06-09 84 views
4

例如,我有兩個型號:Model1Model2。它們與模型層面上的任何關鍵字段不直接相關。對於這兩個模型我有序列化器。我正在尋找在Model1序列化程序中有Model2 queryset的方式。例如:序列化方法場內Django的REST框架

GET /api/model1/01 

根據Model1 ID在請求我可以讓查詢Model2對象,我需要響應於被髮送。現在我有我不喜歡的解決方案:在Model1序列化程序我有方法字段返回對象列表。在Serializer1的方法字段中使用Model2序列化程序還是有任何其他解決方案的方法?

回答

5

解-1:在一個Model1SerializerMethodField()

在該方法中使用Model2Serializer,我們在Model1Serializer限定model2_dataSerializerMethodField()字段。在那裏,我們將首先使用當前的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:我知道這些解決方案是不乾淨。如果這兩個模型相關,我們可以用更清晰的方式來解決這個問題。

+1

謝謝!我實現了第一個選項,似乎這就是我正在尋找的。 – napilnik

相關問題