Задать вопрос
@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)
  • Вопрос задан
  • 209 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest
Работаю с Python/Django
1.Сигналы
2.Переопределите метод save.
Но прежде чем делать это учтите что сейчас это, уж извините, это ужас а не структура данных.
В качестве пользователя использую стандартного джангового юзера

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

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

Похожие вопросы