Django Rest Framework 'Manager' 对象不可下标

Posted

技术标签:

【中文标题】Django Rest Framework \'Manager\' 对象不可下标【英文标题】:Django Rest Framework 'Manager' object is not subscriptableDjango Rest Framework 'Manager' 对象不可下标 【发布时间】:2019-09-30 08:41:45 【问题描述】:

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

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

一切正常,但有a check in django-rest-framework (relations.py)。对于我的模型,此检查失败。实际上,他们正在检查 Manager 类的类型,但我的经理是 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

【问题讨论】:

显示完整的回溯。 @DanielRoseman queryset[:cutoff] 失败,因为 (this)[github.com/encode/django-rest-framework/blob/master/… 方法返回管理器而不是查询集。 但这仍然不够上下文。这个管理器在哪里使用?显示整个事物,以及相关的视图/序列化器。 @DanielRoseman 请参阅编辑。我认为我的问题是有效的,但我无法正确解释(英语不是主要语言)。 这个问题的核心是我使用BaseManager.from_queryset(EmployeeQuerySet) 作为我的经理。如果我从Manager 继承它,一切正常。因为BaseManager 不是Manager 的实例,反之亦然。 【参考方案1】:

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

您可能会对 Django documentation 命名 BaseManager 感到困惑不是 models.BaseManager 而是继承自 models.Manager 的基本管理器。

【讨论】:

【参考方案2】:

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

例子:

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

【讨论】:

以上是关于Django Rest Framework 'Manager' 对象不可下标的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

Django:rest framework之分页(Pagination)