这是我的模型和视图文件.


class Article(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')
    caption = models.CharField(max_length=250)
    
    @property
    def average_rating(self):
        return self.articlecomments.all().aggregate(Avg('rate')).get('rate__avg', 0.00)

class ArticleComment(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article, on_delete=models.CASCADE, null=True, blank=True, related_name='articleratings')
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='articleratings_author')
    rate = models.IntegerField(default='0')
class ArticleByCategoryViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Article.objects.all().order_by('-average_rating')
    serializer_class = ArticleSerializer
    pagination_class = StandardResultsSetPagination

我试图做的是根据文章的评级对文章进行排序,但这不起作用.它给了我这个错误:

raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'average_rating' into field. Choices are:......

我把它当做财产.我怎么才能解决这个问题呢?有没有其他办法?

推荐答案

不能按属性排序,因为此字段在数据库中不存在.

首先注释此字段,然后使用order_by.

试试这个:

queryset = Article.objects.annotate(
    average_rating=Avg('articlecomments__rate', default=0)
).order_by('-average_rating')

编辑:添加返回0值作为默认值的逻辑

Django相关问答推荐

Urls.py中路径**kwargs的Django翻译?

过滤查询以获取两个朋友之间的聊天消息?

int_list_validator在 Django 表单中不起作用

在 GoDaddy 上安装 django 站点

如何让两个模型相互引用 Django

是否可以在没有模型的情况下创建自定义管理视图

在 Django 的 ORM 中访问存储过程的最佳方法是什么

Django error:不能分配必须是实例

在 Django 中,您可以向查询集添加方法吗?

Django:将原始html(来自数据库)显示为html,而不是呈现

Django Admin - 覆盖自定义表单字段的小部件

用户组和权限

Python/Django:从 values_list() 创建一个更简单的列表

Django:访问给定字段的 Select 元组

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

Django查询在哪里

Django 存储匿名用户数据

Django:从视图中添加 non_field_error?

如何动态访问 Django 模型字段详细名称?

Heroku & Django:OSError: No such file or directory:'/app/{myappname}/static'