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}
]
}
我有两个型号如下:
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}
]
}