2017-01-21 128 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以外的其他任何東西都將大大煩擾(至少可以說)任何人在您的代碼上工作。

相關問題