json - 在 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'
]
这种方法的问题是“所有服务”的值在序列化的每一行中都重复。它只需要一次。我还想尽量减少传输的数据。
解决方案
您可以在序列化程序本身中执行此操作。定义所需的新字段并将其添加到字段中。从资源模型中标记序列化程序中的所有字段。
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
推荐阅读
- r - 有没有办法可以使用 RStudio 将日志网格线添加到我的图表中?
- ios - 通过代码将 WKInterfacebutton 背景图像更改为系统模板 (SWIFT)
- laravel - Laravel sortByDesc 链与多链
- azure - Azure ARM 模板用户定义函数
- python - 为什么matplotlib 3D中的错误返回为cm未定义
- mapbox-gl-js - 如何检查光标在地图框中移动到地图之外?
- bash - 带有 bash -c 的 exec.Command 不返回标准输出
- java - 从出现在 Windows 文件资源管理器后面的 BAT 启动 javaw JFrame
- python - Python pd.read_excel - 在所有 Excel 表格中查找重复的行
- c# - 如何将 3D 对象转向鼠标