我在使用django-rest集成django模型的自定义管理器和查询集时遇到困难。我已经定义了一个名为' manager'的自定义管理器。但是rest_framework要求经理必须作为'对象'在模型中。
以下是我的django代码: -
自定义查询集和管理器
class ActivableQuerySet(QuerySet):
def all(self, return_all=False):
if return_all:
return super(ActivableQuerySet, self).all()
else:
return self.get_active()
def get_active(self):
return super(ActivableQuerySet, self).filter(is_active=True)
@transaction.atomic
def delete(self):
for obj in list(self):
obj.delete()
class ActivableModelManager(Manager):
_queryset_class = ActivableQuerySet
def all(self, *args, **kwargs):
return self._queryset_class(self.model, using=self._db, hints=self._hints).all(*args, **kwargs)
models.py
class DictStrModelMixin(Model):
class Meta:
app_label = 'generic_models'
abstract = True
def __str__(self):
return str(model_to_dict(self))
class ActivableModel(DictStrModelMixin):
is_active = BooleanField(editable=False, null=False, default=True)
manager = ActivableModelManager()
class Meta:
abstract = True
_default_manager = "manager"
def delete(self, *tupargs, **kwargs):
pre_delete.send(sender=self.__class__, instance=self)
self.is_active = False
self.save(force_update=True)
post_delete.send(sender=self.__class__, instance=self)
类ActiveSerializer(ModelSerializer): 类Meta: model = ActivableModel fields =' 所有'
现在,调用ActiveSerializer.save()会给我以下错误: - type object' ActivableModel'没有属性'对象' 以下是rest_framework中的代码行,它给出了我的错误
为什么会这样?没有django提供默认管理器'对象'对于所有型号?我也尝试在Meta类中设置_default_manager选项,但它不起作用。在django中定义自定义管理器和查询集的正确方法是什么?
提前致谢。
答案 0 :(得分:2)
您已将您的经理分配到ActivableModel中的manager
,而不是objects
。
答案 1 :(得分:1)
没有django提供默认管理器'对象'对于所有型号?
没有。只有当您没有明确地自己提供经理时,它才会这样做。
同样过滤默认管理员`所有查询集的结果通常是一个相当糟糕的主意,cf https://docs.djangoproject.com/en/1.10/topics/db/managers/#default-managers
wrt /您在BaseSerializer
(无论来自哪里)的问题,您可以通过正确的实施方式向作者提交补丁,以寻找_default_manager
而不是objects
(参见上文链接),但正如丹尼尔罗斯曼所提到的那样,将objects
以外的任何其他内容命名为默认管理员,这将主要惹恼(至少可以说)任何处理代码的人。