Переименовать поля ответов Django Rest framework сериализатор
Я вызываю простой API get с помощью djangorestframework. Моя модель
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"
    }
]
Я хочу изменить имена полей ответов, поскольку это только для моей БД и не хочу раскрывать в ответе. Если я изменю имя в классе сериализатора, он не даст ошибки сопоставления полей.
также я хочу настроить другие параметры как выше ответ в объекте ответа с сообщением и статусом, как показано ниже.
{
status : 200,
message : "Category List",
response : [
        {
            "id": 1,
            "name": "ABC"
        }
    ]
}
нужен правильный направляющий выступ и подача. Специалисты помогают.
3 ответов
первый на category_ в именах полей является избыточным. Потому что вы уже назначаете этим полям Category model, и, делая это, вы создаете "пространство имен" для этих полей.
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)
вы можете переопределить функцию 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
вы можете просто завернуть его в 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 для сериализации с разными именами.
