重命名响应字段django rest framework serializer

Pin*_*ani 7 python django jsonserializer django-rest-framework

我正在使用djangorestframework调用一个简单的get API.我的模型是

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

当我点击URL上的请求并返回以下响应时,它工作正常.

[
    {
        "category_id": 1,
        "category_name": "ABC"
    }
]
Run Code Online (Sandbox Code Playgroud)

我想更改响应字段名称,因为它仅适用于我的数据库,并且不希望在响应中进行披露.如果我更改序列化程序类中的名称,而不是给出字段匹配错误.

此外,我想在响应对象中定制其他参数,如上面的响应,消息和状态如下所示.

{
status : 200,
message : "Category List",
response : [
        {
            "id": 1,
            "name": "ABC"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

需要适当的指导和流程.专家帮忙.

Sar*_*iev 18

首先全部使用的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
Run Code Online (Sandbox Code Playgroud)

在django idAutoField中自动创建为什么需要明确设置它?

并回答您的问题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']
Run Code Online (Sandbox Code Playgroud)

而且您可以手动更改您的回复

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)
Run Code Online (Sandbox Code Playgroud)