Сериализатор Django Rest Framework create () не запускается - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующий сериализатор

class MyModelSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    def create(self, validated_data):
        print("TEST")
        MyModel, created = MyModel.objects.get_or_create(**validated_data)
        return MyModel

    class Meta:
        model = MyModel
        fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)

и следующий набор:

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

Когда я выполняю POST запрос к конечной точке, соответствующей указанному набору, create() метод абсолютно ничего не делает.Я пытался распечатать в консоли TEST, как вы можете видеть, но ничего.

У кого-нибудь есть идеи по поводу этого странного поведения?

Спасибо за продвижение!

Изменить: вызов API:

return axios({
  method: 'post',
  url: 'http://localhost:8000/api/mymodel/',
  data: {
     title: this.title,
     movie: this.id,
     text: this.text,
     user: this.user
}

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Если вы посмотрите на реализацию обработки POST во ViewSet, вы найдете следующее:

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Ваш метод create вызывается после того, как сериализатор проверяет данные.

Ошибка, которую вы видите ( пользователь уже существует ), является результатом вызова serializer.is_valid из приведенного выше фрагмента.

Следовательно, вам никогда не удастся вызвать ваш * 1012. *Ваш craete будет вызываться как часть self.perform_create() из этого фрагмента выше.

Так что это означает, что вы пытаетесь создать пользователя, который уже существует.Так что в вашей модели у вас есть уникальное имя пользователя.

0 голосов
/ 27 сентября 2018

Хорошо.Я нашел альтернативу.Так как я хотел получить только имя пользователя из пользовательского объекта, я удалил user = UserSerializer() и добавил user_username = serializers.ReadOnlyField(source='user.username'):

class ReviewSerializer(serializers.ModelSerializer):
    user_username = serializers.ReadOnlyField(source='user.username')

    class Meta:
        model = Review
        fields = ('pk', 'title', 'user', 'user_username', 'movie', 'timestamp', 'review_text',)

user = UserSerializer() дал мне головную боль, так что я справился с этим.Я проверю ответ Энтушиаста Мартина как решение, так как они привели меня к фактическому ответу.Спасибо.

Решено.

0 голосов
/ 27 сентября 2018

Это может произойти из-за того, что у вас есть какая-то обработка ошибок, потому что способ написания вашей функции def create приведет к ошибке.Я протестировал приведенный ниже код, и он сработал для меня. Попробуйте:

class MyModelSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = MyModel
        fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)

    def create(self, validated_data):
        print("TEST")
        data = validated_data
        data, created = MyModel.objects.get_or_create(**data)
        return data

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...