Получение и сохранение значения из POST с помощью вложенного сериализатора

class InfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventInfo
        fields = ('email', 'pin')

class EventSerializer(DataSerializer, GeoModelAPIView):
    # other fields
    event_info = InfoSerializer(read_only=True)

    def create(self, validated_data):
        event_info = validated_data.pop('event_info', {})
        event = super().create(validated_data)
        EventInfo.objects.create(event=event, **event_info)
        return event

модель

class EventInfo(models.Model):
    pin = models.CharField(max_length=60, null=False, blank=False)
    email = models.EmailField()
    event = models.ForeignKey(Event)

СООБЩЕНИЕ

{
    # other data
    "event_info": {
        "email": "example@example.com",
        "pin": "1234567890"
    }
}

Итак, у меня есть модель, которая не отображается в API с возможностью просмотра, но я хочу иметь возможность сохранять данные из запроса POST в эту модель. Используя этот код, я могу создавать объекты, и он правильно связывает информацию с правильной моделью событий. Однако поля электронной почты и пин-код не будут сохранены. Я понял, что данные 'event_info' из POST не видны в validated_data.

Проверка идет к методу проверки DataSerializer, но я думаю, что я должен каким-то образом обойти проверку только для данных 'event_info'?

Редактировать:

class EventViewSet(BulkModelViewSet, JSONAPIViewSet):
    queryset = Event.objects.filter(deleted=False)
    queryset = queryset.select_related('location')
    queryset = queryset.prefetch_related(list of related fields)
    serializer_class = EventSerializer
    filter_backends = (EventOrderingFilter, filters.DjangoFilterBackend)
    filter_class = EventFilter
    ordering_fields = (fields to order by)
    ordering = ('-last_modified_time',)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def initial(self, request, *args, **kwargs):
        super().initial(request, *args, **kwargs)

    def get_serializer_context(self):
        context = super(EventViewSet, self).get_serializer_context()
        context.setdefault('skip_fields', set()).update(set([
        'headline',
        'secondary_headline']))
        return context


    @atomic
    def create(self, request, *args, **kwargs):
        return super().create(request, *args, **kwargs)

    def perform_create(self, serializer):
        if isinstance(serializer.validated_data, list):
        event_data_list = serializer.validated_data
        else:
            event_data_list = [serializer.validated_data]

        super().perform_create(serializer)

0 ответов

Другие вопросы по тегам