Получение и сохранение значения из 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)