首页 > 解决方案 > 在 Django 中向序列化响应添加附加数据

问题描述

更新

我把我的简化问题变成了一个真实的例子。

我使用 ModelSerialzer 创建了来自模型的数据的工作后响应,我从视图类中的 post 方法调用它。我想在响应中添加其他数据。这是我的 CBV 中的相关代码:

def post(self, request, format=None):
    user_profile = UserProfiles.objects.get(user=request.user.id)
    service_id = user_profile.service_id
    rec_filter = Recommendations.objects.values_list('resource')
    if service_id > 0:
        service_name = Services.objects.get(pk=service_id)
        programs = Programs.objects.filter(services=service_id)
        resources_filtered = Resources.objects.filter(program__in=programs).exclude(id__in=rec_filter)
    else:
        service_name = 'All Services'
        resources_filtered = Resources.objects.exclude(id__in=rec_filter)

    serializer = ResourceSerializer(resources_filtered, many=True)
    #serializer.data["service"] = service_name
    return Response(serializer.data)

注释掉的行是我尝试在此处的类似帖子上添加数据库。我在 API 调用中收到 500 响应。正确的方法是什么?如果有必要提及,响应数据是 JSON。

这是模型序列化器:

class ResourceSerializer(serializers.ModelSerializer):
organization = OrganizationSerializer(read_only=True)
program = ProgramSerializer(read_only=True)

class Meta:
    model = Resources
    fields = [
        'organization',
        'program',
        'link',
        'contact',
        'general_contact',
        'eligibility',
        'service_detail'
    ]

答案测试

以下是基于答案的更新代码,并修正了修复和错误:

class ResourceSerializer(serializers.ModelSerializer):
organization = OrganizationSerializer(read_only=True)
program = ProgramSerializer(read_only=True)
service = serializers.SerializerMethodField()

def get_service(self, obj):
    return "All Services"

class Meta:
    model = Resources
    fields = [
        'organization',
        'program',
        'link',
        'contact',
        'general_contact',
        'eligibility',
        'service_detail',
        'service'
    ]

这种方法的问题是“所有服务”的值在序列化的每一行中都重复。它只需要一次。我还想尽量减少传输的数据。

标签: jsondjangorestdjango-serializer

解决方案


您可以在序列化程序本身中执行此操作。定义所需的新字段并将其添加到字段中。从资源模型中标记序列化程序中的所有字段。

class ResourceSerializer(serializers.ModelSerializer):
    service = serializers.SerializerMethodField()

    def get_service(self):
            return "All Services"

    class Meta :
        model = Resources
        fields = ('service')           #Mark all the fields required here from resource model

推荐阅读