Сериализатор Django с остальными - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть следующие модели:

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? Это проблема дизайна?

1 Ответ

0 голосов
/ 04 ноября 2018

Измените его на

name = serializers.CharField(source='task_parameter.name')
...