【问题标题】:Getting error: type object 'x' has no attribute 'objects', while defining custom queryset and model出现错误:类型对象“x”没有属性“对象”,同时定义自定义查询集和模型
【发布时间】:2017-06-06 08:07:00
【问题描述】:

我在将 django 模型的自定义管理器和查询集与 django-rest 集成时遇到困难。我已经定义了一个名为“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): 元类: 模型 = ActivableModel 字段 = '全部'

现在,调用 ActiveSerializer.save() 会出现以下错误:- 类型对象“ActivableModel”没有属性“对象” 以下是rest_framework中的代码行,它给了我这个错误

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

提前致谢。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您已将经理分配给 ActivableModel 中的 manager,而不是 objects

    【讨论】:

    • 我不想在我的模型中将对象作为管理器。但是 django rest 框架代码需要它。有什么办法吗?
    • 你为什么不想要它?
    • 我已经定义了自定义管理器和查询集。我想将自定义管理器的实例设置为对象。但由于对象没有那么有意义,我想使用其他术语,如“经理”。但它不适用于 django-rest,因为它需要模型类中的“对象”。有什么办法可以缓解吗?也让我知道,如果我做错了什么或者有更好的方法。此外,请在您的答案中指定它,以便它可以被投票。
    • 这似乎不是一个很好的理由。 objects 是命名默认管理器的标准和预期方式;远非“没那么有意义”,它被所有 Django 程序员所理解。给你的经理打电话唯一能做到的事情就是让任何查看你代码的人感到困惑。
    【解决方案2】:

    django 不是为所有模型提供默认管理器“对象”吗?

    没有。仅当您自己没有明确提供经理时,它才会这样做。

    同时过滤默认管理器`所有查询集的结果通常是一个相当糟糕的主意,参见https://docs.djangoproject.com/en/1.10/topics/db/managers/#default-managers

    wrt/ 你对BaseSerializer 的问题(无论它来自哪里),你可以向作者提交一个补丁,并使用适当的实现寻找_default_manager 而不是objects(参见上面的链接),但是 正如 Daniel Roseman 所提到的,将默认管理器命名为 objects 以外的任何名称都会让(至少可以这么说)任何处理您的代码的人感到厌烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2021-12-04
      • 2020-04-14
      相关资源
      最近更新 更多