Расчет рейтинга Avrage не работает после миграции django

Мой код делал то, что должен был делать до миграции, вычисляя рейтинг. После миграции он просто не вычислял рейтинг. Похоже, что миграция не заметила код, который у меня был в choices= RATINGS). У кого-нибудь есть идеи, как я могу исправить это и заставить код снова заметить выбор? Так как при тестировании перед миграцией все работало нормально.

**code from model.py**


class Review(models.Model):
    product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE)
    rating = models.IntegerField(default=3)
    content = models.TextField()
    created_by = models.ForeignKey(User, related_name='reviews', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    RATINGS = (('1 ',1),('2 ',2),
          ('3 ',3),('4 ',4),('5 ',5))
    rating = models.CharField(max_length=7,choices= RATINGS)

    def __str__(self):
        return '%s - %s' % (self.product.name, self.created_by)

код в файле миграции:

class Migration(migrations.Migration):

    dependencies = [
        ('products', '0004_review'),
    ]

    operations = [
        migrations.AlterField(
            model_name='review',
            name='rating',
            field=models.CharField(choices=[('1 ', 1), ('2 ', 2), ('3 ', 3), ('4 ', 4), ('5 ', 5)], max_length=7),
        ),
    ]

А это фрагмент миграции после того, как я заметил, что рейтинг исчез, хотя код был таким же после миграции в models.py:

enter image description here

Как сказал @Willem в комментарии, вы не можете суммировать Charfield, потому что если вы хотите добавить:

'1' + '1'

Вы получите:

'11'

Проблема в том, что вы изменили вот это:

rating = models.IntegerField(default=3)

К этому:

RATINGS = (('1 ', 1), ('2 ', 2), ('3 ', 3), ('4 ', 4), ('5 ', 5))
rating = models.CharField(max_length=7,choices= RATINGS)

А вы даже не удалили старый :)

Если вы хотите, чтобы он работал, измените его на:

class Review(models.Model):
    ...
    RATINGS = ((1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'))
    rating = models.IntegerField(default=RATINGS[2], choices=RATINGS)

Обратите внимание, что первый должен быть integer один, а второй может быть как string.

Вернуться на верх