![](/img/trans.png)
[英]How to save nested Backbone models with Django REST Framework
[英]How to save a nested object in separate models in Django?
我正在嘗試將嵌套的 object 保存到我的 Django 應用程序中的兩個不同表中。 我遺漏了一些東西,因為我從子 Model 收到驗證錯誤。 我的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
它應該是:
for p in events_validated_data:
p['id'] = plan
正如 Yery cs 建議的那樣,還必須從序列化程序中排除外鍵字段。
看來,您需要在 PlanSerializer 中傳遞計划主鍵,而不是計划 object。
for p in events_validated_data:
p['plan'] = plan.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.