Пользовательская функция для API Django Framework - PullRequest
0 голосов
/ 16 июня 2020

Работа над пользовательской функцией API, которая работает над созданием и обновлением рейтингов

, когда я пытаюсь протестировать запуск функции в Postman, я получаю следующую ошибку:

IntegrityError at /api/movies/1/rate_movie/

UNIQUE constraint failed: API_rating.user_id, API_rating.movie_id

, поэтому я не знаю, может ли ошибка быть в коде или что это за код ниже

@action(detail=True, methods=['POST'])
def rate_movie(self, request, pk=None):

    if 'stars' in request.data:

        movie = Movie.objects.get(id=pk)
        #user = request.user #Can not use now due to lack of auth, login
        user = User.objects.get(id=1)
        stars = request.data['stars']

        try:
            rating = Rating.objects.get(user=user.id, movie=movie.id)
            rating.stars = stars
            rating.save()
            serializer = RatingSerializer
            response = {'message': 'Rating Updated', 'results': serializer.data}
            return Response(response, status=HTTP_200_OK)

        except:
            rating = Rating.objects.create(user=user, movie=movie, stars=stars)
            serializer = RatingSerializer
            response = {'message': 'Rating Created', 'results': serializer.data}
            return Response(response, status=HTTP_200_OK)

    else:
        response = {'message':'Stars not selected for rating'}
        return Response(response, status=HTTP_400_bad_request)

Наконец, вот изображение образца теста, который я сделал когда я получил ошибку

enter image description here

1 Ответ

1 голос
/ 16 июня 2020

Что-то незаметно выдает ошибку и ловит ваш общий c except

Похоже, ваша модель Rating имеет уникальное ограничение, которое позволяет пользователю только один раз оценить mov ie, что имеет смысл. Следовательно, вы не можете сделать Rating.objects.create(user=user, movie=movie, stars=stars), если существует другой рейтинг от user до movie.

Вместо этого вам нужно обновить существующий, если он существует, в противном случае создать новый. Что-то вроде:

Rating.objects.update_or_create(user=user, movie=movie, defaults={stars:stars})

Похоже, это то, что вы пытаетесь сделать, но

  • Не используйте generi c except без крайней необходимости! Он может скрыть ваши ошибки и привести к ошибкам. В этом случае он скрывает тот факт, что:
  • Вам нужно сделать serializer = RatingSerializer() (с помощью parens ()) или, еще лучше, serializer = self.get_serializer() и определить атрибут serializer_class class
...