2017-01-21 104 views
0

我正在面向使用django-rest的django模型的自定义管理器和查询集的集成困难。我定义了一个名为'manager'的自定义管理器。但rest_framework要求管理器必须在模型中作为“对象”使用。获取错误:在定义自定义查询集和模型时,类型对象'x'没有属性'对象'

以下是我的Django代码: -

custom queryset and manager

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行,这给了我这个错误

enter image description here

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

在此先感谢。

回答

2

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

+0

我不想在我的模型中拥有对象作为经理。但Django休息框架代码需要它。有什么出路吗? –

+0

你为什么不想要它? –

+0

我已经定义了自定义管理器和查询集。我想将自定义管理器的实例设置为对象。但是因为对象没有那么有意义,所以我想用'经理'这样的其他术语。但它不适用于django-rest,因为它期望模型类中的“对象”。有什么方法可以缓解它吗?另外让我知道,如果我做错了什么或有更好的方式做。此外,请在您的答案中指明它,以便它可以被提高。 –

1

Doesn't django provides default manager 'objects' for all the models ?

不会。只有在您自己没有明确提供经理时才这样做。

而且过滤默认的管理员`所有查询集通常是一个相当糟糕的主意,CF https://docs.djangoproject.com/en/1.10/topics/db/managers/#default-managers

WRT /你的问题的结果与BaseSerializer(无论它来自),您可以提交一个补丁,笔者用一个适当的实现寻找_default_manager而不是objects(参见上面的链接),丹尼尔罗斯曼提到,命名您的默认管理器除了objects以外的其他任何东西都将大大烦扰(至少可以说)任何人在您的代码上工作。

相关问题