Ответы пользователя по тегу RESTful API
  • Как исправить ошибку при записи в БД (связанные таблицы)?

    @javedimka
    Хочу сока
    К сожалению не помогло, ошибка та же:

    Вариант раз, подходит для вложенных сериалайзеров

    Пишешь два сериалайзера, один для GET, с твоим, расширенным представлением для связанного Place, другой для POST/PUT с стандартной реализацией которая сериализует связанный объект как его id, потом во вью возвращаешь либо первый либо второй, т.е.:

    class EventGETSerializer(serializers.ModelSerializer):
        place = PlaceSerializer(read_only=True)
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link', 'date', 'time')
    
    class EventSerializer(serializers.ModelSerializer):
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link', 'date', 'time')

    В вью переопределяешь get_serializer_class метод:
    from rest_framework import permissions
    
    
    class EventList(generics.ListCreateAPIView):
        queryset = Event.objects.all()
    
        def get_serializer_class(self):
            if self.request.method in permissions.SAFE_METHODS:
                return EventGETSerializer
            else:
                return EventSerializer



    update:
    Вариант два, странно работает, но не нарушает принципов DRY и возможно подходит если устраивает стандартное представление данных с depth=1

    Развивая тему с depth, решил попробовать:
    Без блока else не корректно себя ведет, не знаю почему.
    Необходимо использовать дженерики/вьюсеты или самому передавать объект запроса в сериалайзер.
    from rest_framework.permissions import SAFE_METHODS
    
    
    class EventSerializer(serializers.ModelSerializer):
    
        def __init__(self, *args, **kwargs):
            request = kwargs.get('context', {}).get('request')
            if request is not None and request.method not in SAFE_METHODS:
                self.Meta.depth = 0
            else:
                self.Meta.depth = 1
            super().__init__(*args, **kwargs)
    
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link',
                      'date', 'time')

    Ответ написан