Как передать дополнительный параметр с помощью execute_create из django rest framwork?

Я использую общие рамки django. Я пытаюсь вставить запрос имени пользователя в поле автора сообщения.

сериализаторы

class PostSerializer(serializers.ModelSerializer):
    spoter = serializers.PrimaryKeyRelatedField(
        queryset= User.objects.all(),
        )

class Meta:
    model = PostModel
    fields = ('author','text')

Посмотреть

class UserRequestMixin(object):
    def perform_update(self, serializer):
        serializer.save(author = self.request.user.id)

    def perform_create(self, serializer):
        serializer.save(author = self.request.user.id)

class PostViewSet(UserRequestMixin,DefaultsMixin,viewsets.ModelViewSet):

    permission_classes = (IsOwnerOrReadOnly,)
    queryset = PostModel.objects.all()
    serializer_class = PostSerializer

ошибка

 status -> 400
 {
    "author": [
      "This field is required."
     ] 
  } 

3 ответа

Вы должны добавить execute_create() к вашему PostViewSet, указав имя поля, которое должно быть заполнено при сохранении:

class PostViewSet(viewsets.ModelViewSet):

    permission_classes = (IsOwnerOrReadOnly,)
    queryset = PostModel.objects.all()
    serializer_class = PostSerializer

    def perform_create(self, serializer):
        serializer.save(author = self.request.user)

помните, что ваша модель сообщения должна иметь поле автора

В зависимости от того, что вы хотите сделать, вы должны:

  • Пометить поле автора как read_only=True или же required=False
  • Установите поле автора с помощью CreateOnlyDefault

Например:

class PostSerializer(serializers.ModelSerializer):
    spoter = serializers.PrimaryKeyRelatedField(
        queryset= User.objects.all(),
    )

    class Meta:
        model = PostModel
        fields = ('author','text')
        extra_kwargs = {
            'author': {
                'read_only': True,
                'default': serializers.CurrentUserDefault(),
            }
        }

Просто исключите authorполе из ваших полей сериализатора. При звонке serializer.saveвы можете передать любое поле, не обязательно поля сериализатора.

Поля сериализатора включаются в request.dataи автор не является таким полем.

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