#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)
inclass 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