Django 如何按升序创建数据库模型视图?

Django 如何按升序创建数据库模型视图?,django,python-3.x,Django,Python 3.x,我有一个模型,看起来像: from django.db import models from django.db.models import Avg # Create your models here. class Course(models.Model): name = models.CharField(max_length=254, default='') description = models.TextField() price = models.Decimal

我有一个模型,看起来像:

from django.db import models
from django.db.models import Avg

# Create your models here.
class Course(models.Model):
    name = models.CharField(max_length=254, default='')
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    image = models.ImageField(upload_to='images')

    def average_rating(self):
        return self.review_set.aggregate(Avg('rating'))['rating__avg']

    def __str__(self):
        return self.name
我想创建一个视图,以其平均评级的升序/降序显示每个条目

我已经有了其他的观点,比如:

def price_ascend(request):
    courses=Course.objects.order_by('price')
    return render(request, "courses.html", {"courses": courses})
但是,在尝试采用类似的平均评级方法时:

def rating_ascend(request):
    courses=Course.objects.order_by('average_rating')
    return render(request, "courses.html", {"courses": courses})
我遇到了以下错误:
无法将关键字“average_rating”解析到字段中。选项包括:描述、id、图像、名称、orderlineitem、价格、评论

为什么这样不行?在我的HTML中,我有:

{% for course in courses|dictsortreversed:"average_rating" %}
                {{ course.average_rating | floatformat }}
{% endfor %}
这是有效的,并显示了每门课程的平均评分

这是定义Review类的代码

from django.db import models
from courses.models import Course

# Create your models here.
class Review(models.Model):
    RATING_CHOICES = (
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
    )
    course = models.ForeignKey(Course)
    pub_date = models.DateTimeField('date published')
    user_name = models.CharField(max_length=100)
    comment = models.TextField(max_length=300)
    rating = models.IntegerField(choices=RATING_CHOICES)

average_rating
是一种模型方法,不会在DB级别执行。也就是说,如果没有DB Field,您无法执行
order by
操作。您可以做的最好的事情是,使用queryset的
annotate
方法找到平均值