Как сохранить вложенный объект в отдельных моделях в Django?

#python #django #django-models #serialization #django-serializer

Вопрос:

Я пытаюсь сохранить вложенный объект в двух разных таблицах в моем приложении Django. Я что-то упускаю, потому что получаю ошибки проверки из подмодели. Данные в my 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)  

Я пытаюсь сохранить план и событие в их собственную таблицу с этой полезной нагрузкой:

 {  "name": "some name",  "events": [  {  "done": false,  "title": "some title"  },  {  "done": true,  "title": "some title"  }  ] }  

Это каждый раз выдает мне сообщение об ошибке 400 неправильных запросов:

 {  "events": [  {  "plan": [  "This field is required."  ]  },  {  "plan": [  "This field is required."  ]  }  ] }  

Комментарии:

1.Похоже, вам нужно передать первичный ключ плана, а не объект плана в сериализаторе. for p in events_validated_data: p['plan'] = plan.id

2. @Yerycs Спасибо за ваше предложение, но, похоже, это не сработает. Код на самом деле никогда не доходит до этого create метода, он терпит неудачу в этой строке: serializer = self.serializer_class(data=request.data) in class PlanView .

3. Пожалуйста, укажите каждое поле в PlanEventSerializer (не используйте все ). но не включает поле внешнего ключа плана.

4. @Yerycs Спасибо, это было необходимо, также была опечатка, которая вызывала проблемы.

Ответ №1:

Проблема была в том, что я допустил здесь ошибку:

 for p in events_validated_data:  p['plan'] = plan  

Это должно было быть:

 for p in events_validated_data:  p['id'] = plan  

Также пришлось исключить поле внешнего ключа из сериализатора, как предлагал Yery cs.

Ответ №2:

Похоже, вам нужно передать первичный ключ плана,а не объект плана в планировщик.

 for p in events_validated_data:  p['plan'] = plan.id