Как лучше всего реализовать рейтинговую систему на сайте Django?
Учусь на Яндекс практикуме по программе backend developer и свободное время стараюсь максимально расширять свои знания. Начал создавать свой блог,где хочу сделать посты,к которым будут комментарии и рейтинг. Сначала сделал рейтинговую систему,но так получилось,что отметки проставлялись ко всем постам. Потом изменил модель и форму с view. Но теперь вообще ничего не выходит. Как лучше организовать модель и вью,чтобы зарегистрированный пользователь мог оставлять только один балл рейтингу,а не зарегистрированные могли смотреть только средний рейтинг. Жду конструктивную критику. Мой опыт в этом деле два месяца.
Это view для отображения конкретного поста с комментарием и рейтингом.
def show_post(request, post_slug):
post = get_object_or_404(Post, slug=post_slug)
comments = post.comments.all()
if request.method == 'POST':
comment_form = CaptchaCommentForm(data=request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.save()
else:
comment_form = CaptchaCommentForm()
star = Star.objects.aggregate(Avg('rating')).get('rating__avg')
if request.method == 'POST':
star_form = StarForm(data=request.POST)
if star_form.is_valid():
Star.objects.update_or_create(
user=request.user,
post_id=int(request.POST.get("post")),
defaults={'star_id': int(request.POST.get("rating"))}
)
return redirect('post', post.slug,)
star_form = StarForm()
context = {
'star': star,
'star_form': star_form,
'post': post,
'comments': comments,
'comment_form': comment_form,
'menu': menu,
}
return render(request, 'blog/post_detail.html', context)
# Далее идет блок с моделями.
class Star(models.Model):
rating = models.SmallIntegerField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey("Post", on_delete=models.CASCADE)
class Meta:
unique_together = ('user', 'post')
verbose_name = 'Оценка'
verbose_name_plural = 'Оценки'
ordering = ['rating']
def __str__(self):
return f'self.rating'
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
text = models.TextField()
created = models.DateTimeField(auto_now_add=True)
photo = models.ImageField(upload_to="photos/%Y/%m/%d/", blank=True)
slug = models.SlugField(max_length=250, )
rating = models.IntegerField(default=0, null=True, blank=True)
tags = TaggableManager()
class Meta:
ordering = ('-created',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post', kwargs={'post_slug': self.slug})