Django 如何使用ModelSerializer添加其他顶级JSON字段

Django 如何使用ModelSerializer添加其他顶级JSON字段,django,django-rest-framework,Django,Django Rest Framework,我正在使用中的创建API。ModelSerializer可以很好地返回我在数据库中查询的任何内容的JSON列表。但是我需要在JSON响应的根级别有一些额外的字段。如何将查询结果提升到另一个级别,并在JSON对象的根位置添加自定义字段 这是API查询返回的结果: http200正常 允许:获取、头部、选项 内容类型:application/json 更改:接受 [ { “用户”:{ “用户名”:“myuser” }, “内容”:“另一条推特”, “时间间隔”:“2周3天”, “url”:“/twe

我正在使用中的创建API。ModelSerializer可以很好地返回我在数据库中查询的任何内容的JSON列表。但是我需要在JSON响应的根级别有一些额外的字段。如何将查询结果提升到另一个级别,并在JSON对象的根位置添加自定义字段

这是API查询返回的结果:

http200正常
允许:获取、头部、选项
内容类型:application/json
更改:接受
[
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“另一条推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/3/”,
“id”:3
},
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/2/”,
“id”:2
}
]
这就是我想要的:

http200正常
允许:获取、头部、选项
内容类型:application/json
更改:接受
{
“自定义字段”:“自定义值”,
“结果”:[
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“另一条推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/3/”,
“id”:3
},
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/2/”,
“id”:2
}
]
}
serializer.py:

from django.utils.timesince import timesince

from rest_framework import serializers

from tweets.models import Tweet
from accounts.api.serializers import UserDisplaySerializer

class TweetSerializer(serializers.ModelSerializer):
    user = UserDisplaySerializer(read_only=True)
    timesince = serializers.SerializerMethodField()
    url = serializers.CharField(source='get_absolute_url', read_only=True)

    class Meta:
        model = Tweet
        fields = [
            'user',
            'content',
            'timesince',
            'url',
            'id',
            ]

    def get_timesince(self, obj):
        return timesince(obj.created)
views.py:

from django.db.models import Q
from rest_framework import generics
from rest_framework import exceptions
from rest_framework import permissions

from tweets.models import Tweet
from tweets.api import serializers

class TweetListAPIView(generics.ListAPIView):
    serializer_class = serializers.TweetSerializer

    def get_queryset(self, *args, **kwargs):
        queryset = Tweet.objects.all()
        queryset = queryset.order_by('-id')

        return queryset

您可以通过覆盖
ListAPIView
list
方法,然后将此新字段添加到响应中来完成此操作:

from rest_framework.response import Response

def list(self, request, *args, **kwargs):
    queryset = self.get_queryset()
    serializer = self.get_serializer(queryset, many=True)

    response_data = {'custom_field': 'custom value',
                     'result': serializer.data}

    return Response(response_data)

是的,行得通。必须导入rest\u framework.response.responseEyes。。编辑:)工作起来很有魅力!非常感谢。要固定字段的顺序,只需使用
collections
library中的
orderedict
。此外,如果需要申请queryset,请检查此答案。