Django Rest Framework 'Manager' 对象不可订阅

Django Rest Framework 'Manager' object is not subscriptable

我正在使用自定义查询集作为我的模型的管理器。

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/ 终点时发生错误。 (DRF 可浏览 API 尝试呈现员工字段的选择。)

一切正常,但有 a check in django-rest-framework (relations.py)。此检查对我的模型失败。实际上他们正在根据 Manager class 检查类型,但我的经理是 BaseManager 类型(正如预期的那样)而不是 Manager.

这会通过返回管理器而不是查询集来触发错误。有什么办法可以让我这边的支票为真吗? (从 Manager 继承不是一个选择)虽然我认为这应该用 DRF 中的 PR 更新。

回溯

  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

您可能使用的是 ModelManager 而不是 Queryset

示例:

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

Django 文档建议管理器继承自 models.Manager DRF 也是如此。

您可能会对 Django documentation 命名 BaseManager 感到困惑,这 不是 models.BaseManager 而是继承自 [=] 的基本管理器10=].