Расчет поля с использованием данных другой модели - Джанго - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть модель Publications и модель Analysis.Модель анализа имеет несколько полей, которые можно использовать для оценки характеристик публикации.Затем публикация может иметь итоговую оценку, основанную на среднем значении всех входных данных для анализа (вероятно, будет не менее 10 записей для анализа на публикацию).Я могу использовать Avg аннотации, чтобы вычислить итоговый рейтинг в представлениях и показать его в шаблоне , но Я хочу иметь возможность сохранить этот окончательный рейтинг (если возможно) в поле в модели публикаций (или где-нибудь в БД действительно).

Я опасаюсь использовать сигналы, потому что я все еще учусь и продолжаю видеть предупреждения против этого как вариант для новичка.@property не работает, потому что мне нужно иметь доступ к окончательному рейтингу из БД.Я также попытался сделать это, добавив запрос к методу сохранения, но это не сработало, и я понятия не имею (и не смог ничего найти) о том, как заставить его работать.

Вот модели:

class Publications(models.Model):
 title = models.CharField(max_length=150, unique=False, blank=False)
 publisher = models.CharField(max_length=250, unique=False)
 publication_date = models.DateField(default=datetime.date.today)
 user = models.ForeignKey(Current_user, related_name="publications")
 final_rating = models.IntegerField(editable=False, default=0)


class Analysis(models.Model):
 title = models.CharField(max_length=150, unique=False, blank=False)
 publications = models.ForeignKey('publication.Publications', on_delete=models.CASCADE, related_name='analysis')

ratings_range = (
(1, 'Very Weak'),
(2, 'Weak'),
(3, 'Moderate'),
(4, 'Strong'),
(5, 'Very Strong'),
)

 content_rating_1 = models.IntegerField(choices=ratings_range)
 content_rating_1_comment = models.TextField(max_length=300)
 content_rating_2 = models.IntegerField(choices=ratings_range)
 content_rating_2_comment = models.TextField(max_length=300)
 content_rating_3 = models.IntegerField(choices=ratings_range)
 content_rating_3_comment = models.TextField(max_length=300)
 content_rating_4 = models.IntegerField(choices=ratings_range)
 content_rating_4_comment = models.TextField(max_length=300)
 content_rating_5 = models.IntegerField(choices=ratings_range)
 content_rating_5_comment = models.TextField(max_length=300)

queryset = super().get_queryset()
    return queryset.filter(
        user__username__iexact=self.kwargs.get("username")
    ).annotate(
    cr1_avg=Avg('analysis__content_rating_1', output_field=IntegerField()),
    cr2_avg=Avg('analysis__content_rating_2', output_field=IntegerField()),
    cr3_avg=Avg('analysis__content_rating_3', output_field=IntegerField()),
    cr4_avg=Avg('analysis__content_rating_4', output_field=IntegerField()),
    cr5_avg=Avg('analysis__content_rating_5', output_field=IntegerField()),

Любая помощь или предложения приветствуются.

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