I am using a custom Queryset as manager for my model like this.
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
(In some other application related to vacations)
class Vacation(models.Model):
employee = models.ForeignKey(Employee)
(Vacation application has pretty standered Serializer and ViewSet for Vacation Model).
Error happens when I try to get /vacation/
end point. (DRF browsable API tries to render choices for employee field.)
Everything works as expected but there is a check in django-rest-framework (relations.py). This check fails for my model. Actually they are checking type against Manager
class but my manager is of type BaseManager
(as expected) not Manager
.
This triggers an error by returning manager instead of queryset. Is there any way to make this check true from my side? (inheriting from Manager
is not a choice) though I think this should be updated with a PR in 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
The Django documentation recommends the manager to inherit from models.Manager
so does DRF.
You might be confused by the Django documentation naming BaseManager
something that's not models.BaseManager
but instead a base manager that inherits from models.Manager
.