Один отзыв на пользователя в текущем названии
Я пытаюсь сделать так, чтобы каждый пользователь мог разместить только один отзыв на одно название (товар). Первая идея была сделать это через 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():
...