获取错误:输入对象' x'在定义自定义查询集和模型时没有属性'对象'

时间:2017-01-21 11:34:22

标签: python django django-models

我在使用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中的代码行,它给出了我的错误

enter image description here

为什么会这样?没有django提供默认管理器'对象'对于所有型号?我也尝试在Meta类中设置_default_manager选项,但它不起作用。在django中定义自定义管理器和查询集的正确方法是什么?

提前致谢。

2 个答案:

答案 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以外的任何其他内容命名为默认管理员,这将主要惹恼(至少可以说)任何处理代码的人。