Объект проекта не имеет атрибута "review_set" - PullRequest
0 голосов
/ 12 октября 2018

Я получаю сообщение об ошибке Project object has no attribute review_set при попытке получить среднее значение рейтингов с помощью Numpy.

HTML выглядит примерно так, в чем может быть проблема?

<h5>{{ project.review.count }} reviews ({{ 
project.average_design | floatformat }} average rating of design)</h5>
<h5>{{ project.review.count }} reviews ({{ 
project.average_content | floatformat }} average rating of content)</h5>
<h5>{{ project.review.count }} reviews ({{ project.average_usability | floatformat }} average rating of usability)</h5>

модели:

class Project(models.Model):
    title = models.TextField(max_length=200, null=True, blank=True, default="title")
    project_image = models.ImageField(upload_to='picture/', null=True, blank=True)
    description = models.TextField()
    project_url=models.URLField(max_length=250)
    def average_design(self):
        design_ratings = list(map(lambda x: x.design_rating, self.review_set.all()))
        return np.mean(design_ratings)

    def average_usability(self):
        usability_ratings = list(map(lambda x: x.usability_rating, self.review_set.all()))
        return np.mean(usability_ratings)

    def average_content(self):
        content_ratings = list(map(lambda x: x.content_rating, self.review_set.all()))
        return np.mean(content_ratings)



class Review(models.Model):
    RATING_CHOICES = (
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
        (6, '6'),
        (7, '7'),
        (8, '8'),
        (9, '9'),
        (10, '10'),

    )
    project = models.ForeignKey(Project, null=True, blank=True, on_delete=models.CASCADE, related_name="review")
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, related_name='user')
    image = models.ForeignKey(Image, on_delete=models.CASCADE, related_name="project", null=True, blank=True)
    comment = models.TextField()
    design_rating = models.IntegerField(choices=RATING_CHOICES, null=True, blank=True)
    usability_rating = models.IntegerField(choices=RATING_CHOICES, null=True, blank=True)
    content_rating = models.IntegerField(choices=RATING_CHOICES, null=True, blank=True)

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Спасибо, это сработало.Я отредактировал related_name для «reviews» и произвел миграцию в базе данных.

0 голосов
/ 12 октября 2018

У вас есть related_name="review".

project = models.ForeignKey(Project, null=True, blank=True, on_delete=models.CASCADE, related_name="review")

Поэтому вы должны использовать self.review.all() вместо self.review_set.all().

Было бы понятнее, если вы использовали related_name="reviews" (так как каждыйпроект может иметь несколько отзывов).

project = models.ForeignKey(Project, null=True, blank=True, on_delete=models.CASCADE, related_name="reviews")

, и тогда вы будете использовать self.reviews.all().

Обратите внимание, что использование related_name="user" и related_name="project" для других ваших внешних ключей не делаетсмысл.Они используются для получения отзывов для данного пользователя и изображения соответственно, поэтому было бы лучше использовать related_name="reviews" для них обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...