Django Rest Framework 'Менеджер' объект не является подписным - PullRequest
1 голос
/ 13 мая 2019

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

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)

(Приложение для отпуска довольно застойноеСериализатор и ViewSet для отпускной модели).

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

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

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

Traceback

  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

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

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

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

0 голосов
/ 13 мая 2019

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

Пример:

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

...