Объект списка не имеет модели атрибутов в drf - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь вернуть список (созданный с использованием queryset) из переопределенного метода get_queryset () . Я не могу вернуть набор запросов напрямую, так как мне нужно изменить имена столбцов, возвращенные в наборе запросов.

def get_queryset(self):
    project_id=self.request.query_params.get('projectid')


    labelled_img= LabelledImage.objects.filter(project_id=project_id).values('label_id')

    queryset=ArtialClass.objects.filter(labels__label_id__in=labelled_img).values_list('class_name').annotate(total=Count('class_id')).order_by('class_name')
    pagination.PageNumberPagination.page_size = 1000

    return [{'class_name':i[0],'total':i[1]} for i in queryset]

Serializers.py

class ClassificationSerializer(serializers.Serializer):
    class_name=serializers.CharField(max_length=20)
    total = serializers.IntegerField()

В нормальном сценарии код работает нормально , Но когда я пытаюсь добавить класс фильтра

filter_backends = (filters.DjangoFilterBackend,)
filterset_class = ListClassFilter

, я получаю следующую ошибку:

  model = queryset.model
  AttributeError: 'list' object has no attribute 'model'

Traceback

    Traceback (most recent call last):
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
    raise exc
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\mixins.py", line 38, in list
    queryset = self.filter_queryset(self.get_queryset())
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\rest_framework\generics.py", line 150, in filter_queryset
    queryset = backend().filter_queryset(self.request, queryset, self)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django_filters\rest_framework\backends.py", line 90, in filter_queryset
    filterset = self.get_filterset(request, queryset, view)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django_filters\rest_framework\backends.py", line 36, in get_filterset
    return filterset_class(**kwargs)
  File "C:\Users\shubham.kumar30\AppData\Local\Continuum\miniconda2\envs\artial\lib\site-packages\django_filters\filterset.py", line 187, in __init__
    model = queryset.model
AttributeError: 'list' object has no attribute 'model'
[02/Mar/2020 15:01:00] "GET /artial/proj2/classification/ HTTP/1.1" 500 19919

1 Ответ

0 голосов
/ 02 марта 2020

Бэкэнд фильтра ожидает, что вы вернете набор запросов. Вы возвращаете список. Измените свой код следующим образом

def get_queryset(self):
    project_id=self.request.query_params.get('projectid')

    labelled_img= LabelledImage.objects.filter(project_id=project_id).values('label_id')

    queryset=ArtialClass.objects.filter(labels__label_id__in=labelled_img).annotate(total=Count('class_id')).order_by('class_name')

    pagination.PageNumberPagination.page_size = 1000

    return queryset
...