Как проверить наличие определенного атрибута у объекта, на который ссылается внешний ключ в 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/