Как лучше всего реализовать рейтинговую систему на сайте 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})
Вернуться на верх