Объект 'list' не имеет атрибута 'model' - PullRequest
0 голосов
/ 16 октября 2019

Я хочу упорядочить все истории по среднему рейтингу, когда я набираю 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

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Как следует из названия, 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
1 голос
/ 16 октября 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...