2016-09-05 81 views
6

我使用djangorestframework調用一個簡單的get API。我的模型是重命名響應字段django rest框架序列化程序

class Category(models.Model): 
    category_id = models.AutoField(primary_key=True) 
    category_name = models.CharField("Category Name", max_length = 30) 
    category_created_date = models.DateField(auto_now = True, auto_now_add=False) 
    category_updated_date = models.DateField(auto_now = True, auto_now_add=False) 

    def __str__(self): 
     return self.category_name 

serializer.py

class CategorySerializer(serializers.ModelSerializer) : 
    class Meta: 
     model = Category 
     fields = ['category_id', 'category_name'] 

def category_list(request): 
    if request.method == 'GET': 
     categories = Category.objects.all() 
     serializer = CategorySerializer(categories, many=True) 
     return Response(serializer.data) 

它的工作很好,當我打的URL請求,並返回下面的響應。

[ 
    { 
     "category_id": 1, 
     "category_name": "ABC" 
    } 
] 

我想改變的響應字段的名稱,因爲它是隻有我的DB和不願響應透露。如果我更改序列化程序類中的名稱,則不會發出字段匹配錯誤。

另外我想定製其他參數像上面的響應對象與消息和狀態如下。

{ 
status : 200, 
message : "Category List", 
response : [ 
     { 
      "id": 1, 
      "name": "ABC" 
     } 
    ] 
} 

需要適當的指導和流程。專家幫助。

+0

檢查這https://開頭計算器。com/questions/22958058/how-to-change-field-name-in-django-rest-framework – Windsooon

回答

13

首先所有使用category_的字段名都是多餘的。因爲您已經將此字段分配給Category模型,並且通過執行此操作,您正在爲此字段創建「名稱空間」。

class Category(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField("Category Name", max_length = 30) 
    created_date = models.DateField(auto_now = True, auto_now_add=False) 
    updated_date = models.DateField(auto_now = True, auto_now_add=False) 

    def __str__(self): 
     return self.name 

在Django id下拉列表AutoField被自動創建,爲什麼你需要設置明確?

並回答您的問題序列化程序字段中有source參數。

class CategorySerializer(serializers.ModelSerializer): 
    renamed_id = serializers.IntegerField(source='category_id') 
    renamed_name = serializers.CharField(source='category_name') 

    class Meta: 
     model = Category 
     fields = ['renamed_id', 'renamed_name'] 

而且比你可以改變你的迴應手動

from rest_framework import status 

def category_list(request): 
    if request.method == 'GET': 
     categories = Category.objects.all() 
     serializer = CategorySerializer(categories, many=True) 
     response = { 
      'status': status.HTTP_200_OK, 
      'message' : "Category List", 
      'response' : serializer.data 
     } 
     return Response(response) 
+0

嘗試過,但是它給出AssertionError:字段'renamed_id'在串行器CategorySerializer,但尚未包含在「字段」選項中。 –

+0

你只需要改變'Meta'中的'fields'參數。查看更新的答案。 –

+0

工作。謝謝。您能否告訴我哪些是編寫自定義響應代碼的最佳做法。我的意思是寫在serializers.py或views.py? –

2

您可以在序列化程序中覆蓋to_representation函數。請檢查以下代碼,您可以根據需要更新data字典。

class CategorySerializer(serializers.ModelSerializer) : 
    class Meta: 
     model = Category 
     fields = ['category_id', 'category_name'] 
    def to_representation(self, instance): 
     data = super(CategorySerializer, self).to_representation(instance) 
     result_data={"status" : 200,"message" : "Category List"} 
     result_data["response"]=data 
     return result_data 
+0

它正在每個對象中添加 [ 「狀態」:200, 「消息」:「類別列表」, 「迴應」:{ 「CATEGORY_ID」:1, 「CATEGORY_NAME」: 「教育新聞」 } }, { 「狀態」:200, 「消息」: 「分類目錄」, 「響應」 :{ 「category_id」:2, 「category_name」:「Death News」 } }, ] –

1

你可以把它包裝在json。這是你呈現你想要的方式的方式:

from django.http import HttpResponse 
import json 

def category_list(request): 
    if request.method == 'GET': 
     categories = Category.objects.all() 
     serializer = CategorySerializer(categories, many=True) 
     response = {'code: 200, 'message': 'Category List', 'response': serializer.data} 
     return HttpResponse(json.dumps(response), mimetype='application/json') 

這是你可以爲你的字段的方式:

class CategorySerializer(serializers.ModelSerializer): 
    name = serializers.CharField(source='category_name') 

    class Meta: 
     model = Category 
     fields = ['category_id', 'name'] 

這是docs用不同的名稱序列化。

+0

Now它給我以下錯誤 文件「/ Users/smartSense/Pinank」中的文件「/ Users/smartSense/Pinank/Django/Work/MadhaparDemo/MadhaparDemo/Category/urls.py」,第3行,在 from .views import category_list /Django/Work/MadhaparDemo/MadhaparDemo/Category/views.py「,第15行 response = {'code:200,'message':'Category List',response:serializer.data} –

+0

@PinankLakhani對不起,我改變了這一行,嘗試它 –

+0

工作但我仍然無法導入simplejson。我也想重命名字段名稱 –

相關問題