使用Avg进行注释适用于sqlite但不适用于postgresql

时间:2015-08-10 21:50:28

标签: python django postgresql sqlite django-orm

我的模型看起来像这样:

class Review(models.Model):
    RATING_CHOICES = (
        ('1', 'One Star - I can\'t recommend it'),
        ('2', 'Two Star - It was okay'),
        ('3', 'Three Star - I liked it'),
        ('4', 'Four Star - I liked it!'),
        ('5', 'Five Star - I loved it! New favorite!'),
        )
    rating = models.CharField(max_length=10, choices=RATING_CHOICES, blank=False)
    media_object = models.ForeignKey(MediaObject)
    ...

正如您所见,给定的MediaObject可能有很多Reviews。我希望得到一个所有MediaObjects的查询集,按每个对象rating的平均Reviews排序。

使用SQLite时,以下查找工作正常:

MediaObject.objects.all().annotate(ravg=Avg('review__rating')).order_by('-ravg')

但是,在postgresql上,该查找返回以下错误:

ProgrammingError: function avg(character varying) does not exist

我理解错误,但不明白我如何解决/解决它。在使用Django ORM尝试rating之前,如何将Avg转换为数字?

编辑:我们理解,理想的解决方案是首先将这些值存储在IntegerField而不是CharField中。然而,这是一个继承的项目,目前这种改变超出了我的权限范围。 This blog post概述了我认为适当的"正确的"这个问题的解决方案 - 改变数据存储的方式开始。我希望我能做到这一点,如果这是我的个人项目,我将如何处理它。

假设此字段必须是CharField - 是否可以在使用ORM调用Review.rating之前将存储在Avg中的值转换为整数,或者这需要通过raw SQL

来完成

0 个答案:

没有答案