@mezigar

Как обновлять модель в django автоматически?

Есть 2 модели:
1 - это средний рейтинг игры и сама игра соответственно.
Хочется, чтобы при каждой новой оценке пользователя, средний рейтинг обновлялся
Для этого условно написана функция new_avg. Как мне отслеживать, что пользователь ставит новую оценку и автоматом вызывать функцию new_avg?
В качестве пользователя использую стандартного джангового юзера
class AvgRating(models.Model):
    avg = models.FloatField(default=0)
    all = models.IntegerField(default=0)


    def __init__(self, rate = 0):
        self.avg = rate
        self.all = 1

    def new_avg(self, prev_avg, prev_all, rate):
        self.all = prev_all + 1
        self.avg = (prev_avg * prev_all + rate) / self.all
        return self.avg

class Game(models.Model):
    Rate = (
        ('1 star', 1),
        ('2 stars', 2),
        ('3 stars', 3),
        ('4 stars', 4),
        ('5 stars', 5),
    )

    rating = models.CharField(max_length=7, choices=Rate)
    title = models.CharField(max_length=100, default='Mario')
    publisher = models.CharField(max_length=100, null=True)
    developer = models.CharField(max_length=100, null=True)
    avg = models.ForeignKey(AvgRating, on_delete=models.CASCADE, default=0)

    def __str__(self):
        return self.title + " " + str(self.rating)
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest
Работаю с Python/Django
1.Сигналы
2.Переопределите метод save.
Но прежде чем делать это учтите что сейчас это, уж извините, это ужас а не структура данных.
В качестве пользователя использую стандартного джангового юзера

Да? Ну и где это отображено в моделях? Сейчас я вижу, что для каждой игры может быть выставлена только одна оценка и средняя всегда будет равна ей. При этом с юзером эта оценка никак не связана. При этом - достаточно удалить это оценку и запись об игре тоже удалиться.
Далее - документация не рекомендует переопределять конструктор.
Допустим, вы это знаете, но решили, что так будет правильнее, ибо это именно что рекомендация. Но далее вопрос: вам не приходило в голову, что у модели уже есть какая-то важная логика в конструкторе?
Следующий вопрос: почему вы уверены что данные, передаваемые через параметры функции будут актуальнее, чем полученные путем выборки из базы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы