【发布时间】:2022-01-04 07:44:33
【问题描述】:
我正在尝试将嵌套对象保存到我的 Django 应用程序中的两个不同的表中。我遗漏了一些东西,因为我从子模型中得到了验证错误。我的events 中的数据无法识别,并且序列化程序验证失败。我需要以某种方式修改我的序列化程序还是我的模型有问题?
我有这两个模型:
class Plan(models.Model):
name = models.CharField(max_length=200)
class PlanEvent(models.Model):
plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
done = models.BooleanField()
title = models.CharField(max_length=100, blank=True)
然后我有这些序列化程序用于我的模型:
class PlanEventSerializer(serializers.ModelSerializer):
class Meta:
model = PlanEvent
fields = '__all__'
class PlanSerializer(serializers.ModelSerializer):
events = PlanEventSerializer(many=True)
class Meta:
model = Plan
fields = ('name', 'events')
def create(self, validated_data):
events_validated_data = validated_data.pop('events')
plan = Plan.objects.create(**validated_data)
plan_event_serializer = self.fields['events']
for p in events_validated_data:
p['plan'] = plan
events = plan_event_serializer.create(events_validated_data)
return plan
在我的views.py 我这样做:
class PlanView(APIView):
permission_classes = [AllowAny,]
serializer_class = PlanSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我尝试使用此有效负载将 Plan 和 PlanEvent 保存到他们自己的表中:
{
"name": "some name",
"events": [
{
"done": false,
"title": "some title"
},
{
"done": true,
"title": "some title"
}
]
}
这每次都会给我一个错误消息 400 Bad Request:
{
"events": [
{
"plan": [
"This field is required."
]
},
{
"plan": [
"This field is required."
]
}
]
}
【问题讨论】:
-
看来,您需要在序列化程序中传递计划主键,而不是计划对象。
for p in events_validated_data:p['plan'] = plan.id -
@Yerycs 感谢您的建议,但这似乎不起作用。代码实际上并没有达到那个
create- 方法,它在这一行中失败:serializer = self.serializer_class(data=request.data)inclass PlanView。 -
请在 PlanEventSerializer 中指定每个字段(不使用 all )。但不包括计划外键字段。
-
@Yerycs 谢谢,这是需要的,还有一个导致问题的错字。
标签: python django django-models serialization django-serializer