django - Django rest框架序列化程序,带有相关表中的字段
问题描述
我有以下型号:
class Workflow(models.Model):
name = models.CharField(max_length=200)
class Task(models.Model):
name = models.CharField(max_length=200)
class TaskParameter(models.Model):
default_value = models.CharField(max_length=1000, null=True)
name = models.CharField(max_length=200)
task = models.ForeignKey(Task, related_name='parameters', on_delete=models.CASCADE, null=True)
class WorkflowTask(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
workflow = models.ForeignKey(Workflow, related_name='workflow_tasks', on_delete=models.CASCADE, null=True)
class WorkflowTaskParameter(models.Model):
value = models.CharField(max_length=1000)
workflow_task = models.ForeignKey(WorkflowTask, on_delete=models.CASCADE, related_name='workflow_task_parameters', null=True)
task_parameter = models.ForeignKey(TaskParameter, on_delete=models.CASCADE, related_name='+')
所以基本上我尝试做的是拥有包含任务的工作流(使用WorkflowTask
关联表),并且这些任务有参数(TaskParameter
)。这些参数有一个默认值,但我希望能够用另一个参数覆盖这个默认值(这就是WorkflowTaskParameter
表格的用途)。
这是我的序列化程序:
class TaskParameterSerializer(serializers.ModelSerializer):
class Meta:
model = TaskParameter
fields = ('name', 'default_value')
class WorkflowTaskParameterSerializer(serializers.ModelSerializer):
name = serializers.StringRelatedField(many=False) # here i want the name from the associated TaskParameter
class Meta:
model = WorkflowTaskParameter
fields = ('name', 'value')
class WorkflowTaskSerializer(serializers.ModelSerializer):
task = serializers.StringRelatedField(many=False)
workflow_task_parameters = WorkflowTaskParameterSerializer(many=True, read_only=True)
class Meta:
model = WorkflowTask
fields = ('task', 'workflow_task_parameters')
class WorkflowSerializer(serializers.ModelSerializer):
workflow_tasks = WorkflowTaskSerializer(many=True, read_only=True)
class Meta:
model = Workflow
fields = ('name', 'workflow_tasks')
我几乎得到了我想要的结果:
{
"name": "MyWorkflow",
"workflow_tasks": [
{
"task": "MyTask",
"workflow_task_parameters": [
{
// missing the task parameter name here
"value": "myoverridedvalue"
}
]
}
]
}
正如评论中提到的,为什么任务参数名称没有出现在结果中,即使我在其中添加了“名称StringRelatedfield
” WorkflowTaskParameterSerializer
?是设计问题吗?
解决方案
将其更改为
name = serializers.CharField(source='task_parameter.name')
推荐阅读
- python - 在python中,一个字典中可以有多个同名的键吗?如果是这样,您将如何删除特定的?
- python - 从 scipy 优化寻根算法
- ios - 如何创建 Swift 导入子模块
- asp.net - ASP.Net 网站 - 发布不会移动所有文件
- php - php文件从mysql获取最后一个id
- sonarqube - SonarQube TFS 扩展“-X”选项
- reactjs - 在 typescript 中嵌套连接的 redux 容器和展示组件
- mysql - Sql 查询每小时创建一天到 5 个产品销售
- google-oauth - 如何对谷歌机器学习预测端点进行经过身份验证的 Rest 调用?
- java - 如何访问块外的 try-with-resource 变量?