Один отзыв на пользователя в текущем названии

Я пытаюсь сделать так, чтобы каждый пользователь мог разместить только один отзыв на одно название (товар). Первая идея была сделать это через UniqueTogether, но она оказалась неудачной. Теперь я решил сделать это с помощью валидации в сериализаторе.

Прямо сейчас я получаю следующую ошибку: TypeError: Review() got an unexpected keyword argument 'title'. Но если вы посмотрите на мой код ниже, я не передавал аргумент title в Review(). Я даже специально попытался сделать ошибку, чтобы посмотреть, какие аргументы я могу передать в Review(), и title там не оказалось.

django.core.exceptions.FieldError: Cannot resolve keyword 'title_d' into field. Choices are: author, 
author_id, comments, id, pub_date, score, text, title_id, title_id_id

serializers.py

class ReviewSerializer(serializers.ModelSerializer):
    author = serializers.SlugRelatedField(
        slug_field='username',
        default=serializers.CurrentUserDefault(),
        read_only=True
    )

    class Meta:
        model = Review
        fields = ('id', 'text', 'author', 'score', 'pub_date')

    def validate(self, data):
        title_id = self.context['view'].kwargs['title_id']
        author = self.context['request'].user
        if Review.objects.filter(title_id=title_id, author=author).exists():
            raise serializers.ValidationError(
                'You cannot post second review on same item.'
            )
        return data

models.py

class Review(models.Model):
    title_id = models.ForeignKey(
        Title,
        on_delete=models.DO_NOTHING,
        related_name='reviews'
    )
    text = models.TextField(
        'Текст отзыва'
    )
    author = models.ForeignKey(
        User,
        on_delete=models.DO_NOTHING,
        verbose_name='Автор',
        related_name='reviews'
    )
    score = models.IntegerField(
        choices=SCORES
    )
    pub_date = models.DateTimeField(
        'Дата публикации',
        auto_now_add=True,)



class Title(models.Model):
    name = models.CharField(
        max_length=255,
        verbose_name='Название произведения'
    )

    year = models.IntegerField(
        verbose_name='Год произведения'
    )

    category = models.ForeignKey(
        Category,
        on_delete=models.DO_NOTHING,
        verbose_name='Категория произведения',
        related_name='category_title',
    )

    description = models.TextField(
        verbose_name='Описания произведения',
        blank=True,
        null=True
    )

    rating = models.IntegerField(
        verbose_name='Рейтинг произведения',
        blank=True,
        null=True
    )

    genres = models.ManyToManyField(
        Genre,
        through='GenreTitle',
    )

Измените название поля title_id на 'title'. Также в валидации сделайте одно изменение:

def validate(self, data):
    title = int(data['title'])
    author = self.context['request'].user   # here maybe self.request.user might work too
    if Review.objects.filter(title=title, author=author).exists():
    ...
Вернуться на верх