我的模型看起来像这样:
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?