Я использую настраиваемый набор запросов в качестве менеджера для моей подобной модели.
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
queryset[:cutoff]
терпит неудачу, потому что (это) [Метод github.com/encode/django-rest-framework/blob/master/ возвращает менеджер вместо набора запросов. - person Nafees Anwar   schedule 13.05.2019BaseManager.from_queryset(EmployeeQuerySet)
в качестве своего менеджера. Если я унаследую его отManager
, все будет нормально. Потому чтоBaseManager
не является экземпляромManager
, а наоборот. - person Nafees Anwar   schedule 13.05.2019