Объект Django Rest Framework 'Manager' не подлежит подписке

Я использую настраиваемый набор запросов в качестве менеджера для моей подобной модели.

class EmployeeQuerySet(QuerySet):
    def update(self, **kwargs):
        # some checks
        super().update(**kwargs)



class EmployeeManager(BaseManager.from_queryset(EmployeeQuerySet)):
    pass


class Employee(models.Model):
    objects = EmployeeManager

(В другом приложении, связанном с отпуском)

class Vacation(models.Model):
    employee = models.ForeignKey(Employee)

(Приложение Vacation имеет довольно стандартные Serializer и ViewSet для модели Vacation).

Ошибка возникает, когда я пытаюсь получить /vacation/ конечную точку. (Доступный для просмотра API DRF пытается отобразить варианты выбора для поля сотрудника.)

Все работает, как ожидалось, но есть проверка django-rest-framework (Relations.py). Эта проверка не подходит для моей модели. На самом деле они проверяют тип по классу Manager, но мой менеджер относится к типу BaseManager (как и ожидалось), а не Manager.

Это вызывает ошибку, возвращая manager вместо queryset. Есть ли способ сделать эту проверку верной с моей стороны? (наследование от Manager не является выбором), хотя я думаю, что это следует обновить с помощью PR в DRF.

Отслеживание

  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/django/template/defaulttags.py", line 161, in render
    values = self.sequence.resolve(context, ignore_failures=True)
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/django/template/base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/django/template/base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/django/template/base.py", line 858, in _resolve_lookup
    current = current()
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/rest_framework/relations.py", line 222, in iter_options
    self.get_choices(cutoff=self.html_cutoff),
  File "/home/nafees/.venvs/shift/lib/python3.7/site-packages/rest_framework/relations.py", line 202, in get_choices
    queryset = queryset[:cutoff]
TypeError: 'EmployeeManager' object is not subscriptable

person Nafees Anwar    schedule 13.05.2019    source источник
comment
Показать полную трассировку.   -  person Daniel Roseman    schedule 13.05.2019
comment
@DanielRoseman queryset[:cutoff] терпит неудачу, потому что (это) [Метод github.com/encode/django-rest-framework/blob/master/ возвращает менеджер вместо набора запросов.   -  person Nafees Anwar    schedule 13.05.2019
comment
Но этого все еще недостаточно. Где используется этот менеджер? Покажите все это и соответствующий просмотр / сериализатор.   -  person Daniel Roseman    schedule 13.05.2019
comment
@DanielRoseman См. Отредактировать. Я думаю, что мой вопрос верен, но я не могу правильно его объяснить (английский не является основным языком).   -  person Nafees Anwar    schedule 13.05.2019
comment
По сути, эта проблема заключается в том, что я использую BaseManager.from_queryset(EmployeeQuerySet) в качестве своего менеджера. Если я унаследую его от Manager, все будет нормально. Потому что BaseManager не является экземпляром Manager, а наоборот.   -  person Nafees Anwar    schedule 13.05.2019


Ответы (2)


Документация Django рекомендует менеджеру наследовать от models.Manager, так же как и DRF.

Вас может смутить название в документации Django. BaseManager что-то, что не models.BaseManager, а базовый менеджер, наследуемый от models.Manager.

person Linovia    schedule 13.05.2019

Вы, вероятно, используете ModelManager вместо Queryset

Пример :

Employee.objects ==> Employee.objects.all()

person Amine Messaoudi    schedule 13.05.2019