【问题标题】:'list' object has no attribute 'model'“列表”对象没有属性“模型”
【发布时间】:2019-10-16 06:12:49
【问题描述】:

我想按平均评分对所有故事进行排序,当我输入 url .../stories?ordering=average_rating 它会带来错误:'list' object has no attribute 'model'

    def get_queryset(self):
        queryset = Story.objects.all()
        ordering = self.request.query_params.get('ordering', None)
        if ordering == 'average_rating':
            return sorted(queryset, key=lambda s: s.average_rating)
        return queryset
class Story(models.Model):
    ...
    @property
    def average_rating(self):
        average_rating = self.ratings.all().aggregate(Avg('rating'))['rating__avg']
        if average_rating is not None:
            return round(float(average_rating), 2)

        return None

【问题讨论】:

  • 错误信息必须在代码中显示一些行号。你能告诉我们哪个代码语句抛出错误

标签: python django django-models django-rest-framework


【解决方案1】:

顾名思义,get_queryset 需要返回一个查询集,而不是一个列表。

幸运的是,您的整个查询和排序都可以在数据库中完成;你不需要average_rating 方法。

    queryset = Story.objects.annotate(average_rating= Avg('ratings__rating'))
    ordering = self.request.query_params.get('ordering', None)
    if ordering == 'average_rating':
        queryset = queryset.order_by("average_rating")
    return queryset

【讨论】:

  • 我认为 order_by 仅适用于字段,不适用于 @property
  • order_by 适用于字段和注释。在 Daniel 的回复中,构建查询集时,平均值是在 average_rating 中计算的。您不是通过属性订购
【解决方案2】:

sorted(queryset, key=lambda s: s.average_rating) 返回一个列表,而get_queryset 应该返回一个queryset

你可以试试这样的:

def get_queryset(self):
    queryset = Story.objects.all()
    ordering = self.request.query_params.get('ordering', None)
    if ordering == 'average_rating':
        return queryset.annotate(rating_avg=Avg('ratings__rating')).order_by('rating_avg')
    return queryset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多