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
方法找到平均值