Search code examples
djangodjango-rest-frameworkdjango-querysetdjango-managers

Django Rest Framework 'Manager' object is not subscriptable


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

Solution

  • 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.