json - 将附加数据添加到 Django 中的序列化响应

标签 json django rest django-serializer

已更新

我将简化的问题改为真实的示例。

我使用 ModelSerialzer 创建了模型数据的工作后响应,我从 View 类中的 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'
    ]

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

最佳答案

最初尝试的问题是serializer.data 是不可变的。有必要复制并添加到其中。

serializer = ResourceSerializer(resources_filtered, many=True)
augmented_serializer_data = list(serializer.data)
augmented_serializer_data.append({'service': 'All Services'})
return Response(augmented_serializer_data)

此答案基于 @andre-machado 在 this question 中给出的答案.

这里的代码是一个与给出的其他答案一致的示例。

关于json - 将附加数据添加到 Django 中的序列化响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68278606/

相关文章:

javascript - 如何在 jQuery ajax 调用中将 JSON 响应解析为 JSONP?

javascript - 未捕获的类型错误 : $(. ..)。Datatable 不是函数。但在我调用 datatable 之前 Jquery 已经加载了

json - list 不是有效的 JSON。行 : 1, 列 : 1, 意外 token

jquery - 如何读取jquery中post请求的响应?

python - `Django administration` 到项目模板中的自定义标题

java - Vertx 和 Spring Boot 的区别

rest - 当前用户的 SharePoint 2010 REST 筛选器

java - HttpResponse 中的状态代码错误

javascript - 模块不可用、拼写错误或忘记加载(但我没有)

没有 View 的Django URL conf - 链接到另一个域