2017-07-29 119 views
0

下面給出了我的序列化程序類。我有一個模型中的所有字段。我想改變自定義格式的序列化器數據的表示。嘗試使用串行器的呈現方法但無法成功。在django rest框架中自定義Json響應

class MyListSerilizer(ModelSerializer): 
    class Meta: 
    model=MyModel 
    fields=['Name','Address_ID','Portal','Address','City','DisplayOrderDateTime','Email','Order_ID','Order_Code','Item_Code','DispatchedOn','Payment_Mode','Shipping_Charge','ShippingMethodCode','ShippingMethodCharges','CashOnDeliveryCharges','CurrencyCode','BillingAddress','GiftWrapCharges','SaleOrderItemCode','Shipping_ref','Cancellable','OnHold','Quantity','Invoice_No''Portal',........] 

所以在我看來,類定義和輸出對應於他們在這裏也提到了。

class MyListAPIView(ListAPIView): 
     def list(self,request): 
      queryset=MyModel.objects.all() 
      serializer=MyListSerilizer(queryset,many=True) 
      return Response({'Records':serializer.data}) 

輸出:---------->對應於視圖是

"Records": [ 
    { 
     "Name": "abc", 
     "Address_ID": "6819319", 
     "Portal": "amksl", 
     "Address": "", 
     "City": "absjsls", 
     "DisplayOrderDateTime": null, 
     "Email": "[email protected]", 
     "Order_ID": "", 
     "Order_Code": "", 
     "Item_Code": "", 
     "DispatchedOn": "", 
     "Payment_Mode": "" 
    }, 
     { 
     "Name": "abc", 
     "Address_ID": "6819319", 
     "Portal": "amksl", 
     "Address": "", 
     "City": "absjsls", 
     "DisplayOrderDateTime": null, 
     "Email": "[email protected]", 
     "Order_ID": "", 
     "Order_Code": "", 
     "Item_Code": "", 
     "DispatchedOn": "", 
     "Payment_Mode": "" 
    }, 
     so on.... 

所以我的問題是如何將我實現這個JSON格式。總之我如何定製我的視圖類

 { 
     "identifiers":{ 
       "email":"[email protected]", 
       "phone":"123664" 
       }, 
"activity_type": "purchase", 
"timestamp": "UNIX TIMESTAMP",     
"products": [{ 
       "brandName": "abc", 
       "id": "1",         
       "sku": "abcd",         
       "name": "mnis",       
       "price": 12.9, 
       "discount": "", 
       "quantity": "", 
       "currency": "" 
       }] 
"cart_info":{ 
       "total":"", 
       "revenue":"", 
       "currency":"" 
      }, 
"Order_info":{ 
       "total":"2121", 
       . 
       . 
       . 
      } 
    }, 
    { 
     "identifiers":{ 
       "email":"[email protected]", 
       "phone":"123664" 
       }, 
"activity_type": "purchase", 
"timestamp": "UNIX TIMESTAMP",     
"products": [{ 
       "brandName": "abc", 
       "id": "1",         
       "sku": "abcd",         
       "name": "mnis",       
       "price": 12.9, 
       "discount": "", 
       "quantity": "", 
       "currency": "" 
       }] 
"cart_info":{ 
       "total":"", 
       "revenue":"",...so on 
+1

你更願意來定製你的'MyListSerilizer'類。閱讀有關序列化器的文檔 - > http://www.django-rest-framework.org/api-guide/serializers/,應該有幫助 – pkisztelinski

+0

我將如何自定義MyListSerializer單個模型,我試圖將字段分成不同的序列化器類,但是不可行,如果你給我提供一個小例子,那對我來說最好 – user6847618

+0

你可以使用'SerializerMethodField' - > http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield添加一些自定義字段 – pkisztelinski

回答

0

覆蓋to_representation方法在序列化器類

class MyListSerilizer(ModelSerializer): 

    class Meta: 
     model=MyModel 
     fields=['Name','Address_ID','Portal','Address','City','DisplayOrderDateTime','Email','Order_ID','Order_Code','Item_Code','DispatchedOn','Payment_Mode','Shipping_Charge','ShippingMethodCode','ShippingMethodCharges','CashOnDeliveryCharges','CurrencyCode','BillingAddress','GiftWrapCharges','SaleOrderItemCode','Shipping_ref','Cancellable','OnHold','Quantity','Invoice_No''Portal',........] 


    def to_representation(self, instance): 
     # instance is the model object. create the custom json format by accessing instance attributes normaly and return it 


     identifiers = dict() 
     identifiers['email'] = instance.Email 
     identifiers['phone'] = instance.phone 

     representation = { 
      'identifiers': identifiers, 
      'activity_type': instance.xxxx, 
      'timestamp': instance.xxxxx, 
      . 
      . 
      . -> your custom data 
     } 

    return representation 

每當調用serializer.data,這表現辭典將返回