Django 休息视图在响应中包含一对多相关对象

Django rest view include one to many related objects in the response

我有两个型号如下:

class Task(models.Model):
    what_task = models.CharField(max_length=100, )
    how_often = models.CharField(max_length=50, )
    how_important = models.CharField(max_length=50, )
 )

    #This helps to print in admin interface
    def __str__(self):
        return u"%s" % (self.what_task)


class Step(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE, )
    what_step = models.CharField(max_length=50, blank=True, )

    #This helps to print in admin interface
    def __str__(self):
        return u"%s" % (self.what_step)

我已经为他们编写了序列化程序:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'
        depth = 1


class StepSerializer(serializers.ModelSerializer):
    class Meta:
        model = Step
        fields = '__all__'

还有我的观点之一:

@api_view(['GET', 'POST'])
def task_list(request):
    """
    List all tasks, or create a new task.
    """
    if request.method == 'GET':
        tasks = Task.objects.all()
        serializer = TaskSerializer(tasks, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = TaskSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(
                serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这给了我如下数据:

[
  {
    id: 1,
    what_task: "Sample task one",
    how_often: "Daily",
    how_important: "Extremely important",

  }
]

但是我想在检索如下任务时包括相关的 Steps

[
  {
    id: 1,
    what_task: "Sample task one",
    how_often: "Daily",
    how_important: "Extremely important",
    steps:[]
  }
]

此外,当用户创建 Task 时,他还可以同时创建 Steps,我非常期待像上面那样传入 JSON。 我怎样才能做到这一点?我是在序列化程序中还是在视图中处理它?

您将必须覆盖 TaskSerializer 创建任务和步骤的方式。

class StepSerializer(serializers.ModelSerializer):
    class Meta:
        model = Step
        fields = '__all__'


class TaskSerializer(serializers.ModelSerializer):
    steps = StepSerializer(many=True)

    class Meta:
        model = Task
        fields = '__all__'
        depth = 1

    def create(self, validated_data):
        steps_data = validated_data.pop('steps')
        task = Task.objects.create(**validated_data)
        for step_data in steps_data:
            Step.objects.create(task=task, **step_data)
        return task

您可以在文档中找到详细信息:writable-nested-serializers

创建新任务时创建步骤,可以这样操作:

{
    "what_task": "Sample task one",
    "how_often": "Daily",
    "how_important": "Extremely important",
    "steps": [
        {"what_step": 10},
        {"what_step": 123}
    ]
}