Как проверить наличие определенного атрибута у объекта, на который ссылается внешний ключ в Django

Новичок здесь, простите меня, если это легко решаемый вопрос.

<

Как посты, так и комментарии связаны с их автором внешним ключом. И посты, и комментарии имеют атрибут rating(Int). В данном примере я буду говорить о комментариях. Мой вопрос в том, как мне получить все объекты комментариев, связанные с пользователем по внешнему ключу, и можно ли не получать все комментарии, а получить только их значения рейтинга?

Моя модель UserProfile выглядит следующим образом

class UserProfile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    birthdate = models.DateField
    post_rating = models.IntegerField(default=0)
    comment_rating = models.IntegerField(default=0)

    def update_post_rating(self):
        pass

    def update_comment_rating(self):
        pass

Моя модель комментариев выглядит следующим образом

class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.SET('DELETED'))
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    rating = models.IntegerField(default=0)
    content = models.TextField
    date = models.DateField(auto_now_add=True)

    def like(self):
        self.rating = + 1
        self.save()

    def dislike(self):
        self.rating = - 1
        self.save()

Полагаю, вы можете написать что-то подобное :

class UserProfile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    birthdate = models.DateField
    post_rating = models.IntegerField(default=0)
    comment_rating = models.IntegerField(default=0)

    def update_post_rating(self):
        pass

    def update_comment_rating(self):
        related_comments = Comment.objects.filter(author=self.user)
        ratings = list(related_comments.values_list('rating', flat=True))
        avg_rating = sum(rating) / len(rating)
        self.comment_rating = avg_rating
        self.save()

Я предполагаю, что comment_rating - это средняя оценка всех комментариев, прикрепленных к этому пользователю? Вы также можете использовать аннотацию Avg с queryset: https://docs.djangoproject.com/fr/4.1/topics/db/aggregation/

Вернуться на верх