41👍
First of all using category_
in field names is redundant. Because you are already assigning this fields to Category
model, and by doing this you are creating “namespace” for this fields.
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
Second In django id
AutoField is created automatically why would you need set it explicitly?
And answering your question There is source
parameter in serializer fields.
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']
And than you can change your response manually
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)
2👍
You can override to_representation function in serializer.Check the following code you can update data
dictionary as you want.
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
2👍
You can just wrap it up in json
. This is the way you render the way you want:
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')
This is the way you can rename your fields:
class CategorySerializer(serializers.ModelSerializer):
name = serializers.CharField(source='category_name')
class Meta:
model = Category
fields = ['category_id', 'name']
This is the docs for serializing with different names.
- Django forms.ChoiceField without validation of selected value
- Django unable to find MySQLdb python module
- Django logging – django.request logger and extra context
- Django factory boy factory with OneToOne relationship and related field
1👍
In Django 2.1.1 if you are using a viewset, you can customize the other parts of your response by overriding the .list()
action like this
from rest_framework import status
from django.http import HttpResponse
import json
class CategoryViewset(viewsets.ReadOnlyModelViewSet):
categories = Category.objects.all()
def list(self, request):
if request.method == 'GET':
serializer = CategorySerializer(self.categories, many=True)
response = {
'status': status.HTTP_200_OK,
'message' : "Category List",
'response' : serializer.data,
}
return HttpResponse(json.dumps(response), content_type='application/json')