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
【问题讨论】:
显示完整的回溯。 @DanielRosemanqueryset[: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 两因素身份验证
17-Django-Django REST framework-REST framework及RESTful简介