2016-09-05 4 views
6

Ich rufe eine einfache API mit djangorestframework aufrufen. Mein Modell istRename Antwortfelder Django Rest Framework Serializer

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) 

Es funktioniert gut, wenn ich Anfrage kam auf der URL und die Rückkehr folgende Antwort.

Ich möchte die Antwort Feldnamen ändern, wie es nur für meine DB ist und nicht als Reaktion offen legen. Wenn ich den Namen in der Serialisierungsklasse ändere, gibt es keinen Fehler bei der Feldübereinstimmung.

Auch ich möchte andere params wie oben Antwort im Antwortobjekt mit Nachricht und Status wie unten anpassen.

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

Brauchen Sie eine ordnungsgemäße Führung und fließen. Experten helfen.

+0

Prüfung dieses https ändern können: // Stackoverflow.com/questions/22958058/how-to-change-feldname-in-django-rest-framework – Windsooon

Antwort

13

Zuerst von allen mit category_ in Feldnamen ist redundant. Da Sie diese Felder bereits dem Modell Category zuweisen, erstellen Sie für diese Felder "Namespace".

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 

Zweite In django id Autofield, warum würden Sie automatisch erstellt wird, müssen sie explizit festgelegt?

Und beantworten Sie Ihre Frage Es gibt source Parameter in Serializer-Feldern.

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'] 

Und als Sie Ihre Antwort manuell

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

Versucht, aber es geben AssertionError: Das Feld 'umbenannte_ID' wurde auf Serializer deklariert CategorySerializer, wurde jedoch nicht in die Option 'fields' aufgenommen. –

+0

Sie müssen nur 'Felder' Parameter in' Meta' ändern. Siehe aktualisierte Antwort. –

+0

Arbeiten. Vielen Dank. Können Sie mich wissen lassen, welche Vorgehensweise am besten geeignet ist, um den Antwortcode für die Anpassung zu schreiben? Ich möchte in serializers.py oder views.py schreiben? –

2

Sie können to_representation Funktion in Serializer überschreiben.Überprüfen Sie den folgenden Code können Sie data Wörterbuch wie Sie wollen aktualisieren.

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

Es ist in jedem Objekt hinzufügen [ { "Status": 200, "Nachricht": "Category List", "Antwort": { "category_id": 1, "category_name": "Educational News" } }, { "Status": 200, "message": "Kategorieliste", "Antwort" : { "category_id": 2, "kategorie_name": "tod nachrichten" } }, ] –

1

Sie können es einfach in json einpacken. Dies ist die Art und Weise Sie die Art und Weise machen Sie wollen:

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') 

Dies ist die Art und Weise Sie Ihre Felder umbenennen:

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

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

Dies ist die docs für die Serialisierung mit unterschiedlichen Namen.

+0

Jetzt Es gibt mir folgenden Fehler Datei "/ Benutzer/smartSense/Pinank/Django/Arbeit/MadhaparDemo/MadhaparDemo/Kategorie/urls.py", Zeile 3, in von .views import category_list Datei "/ Benutzer/smartSense/Pinank/Django/Work/MadhaparDemo/MadhaparDemo/Kategorie/views.py ", Zeile 15 Antwort = {'Code: 200,' Nachricht ':' Category List ', Antwort: serializer.data} –

+0

@PinankLakhani Es tut mir leid, ich änderte diese Zeile ein wenig, versuchen Sie es –

+0

Arbeiten Aber ich kann noch nicht simplejson importieren. Auch ich möchte die Feldnamen auch umbenennen –

Verwandte Themen