2017-01-21 5 views
0

У меня возникли трудности с интеграцией пользовательского менеджера и набора запросов для моделей django с django-rest. Я определил пользовательский менеджер с именем «manager». Но rest_framework требует, чтобы менеджер был доступен как «объекты» в модели.Получение ошибки: тип объекта «x» не имеет атрибутов «объекты», при определении настраиваемого набора запросов и модели

Ниже мой Джанго код: -

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): класс Meta: модель = ActivableModel поля = 'все'

Теперь, ссылаясь на ActiveSerializer.save() дает мне следующую ошибку: - тип объекта «ActivableModel» имеет нет атрибута «объекты» Ниже приводится строка кода в rest_framework, который дает мне эту ошибку

enter image description here

Почему это так? Разве django не предоставляет объекты «менеджера» по умолчанию для всех моделей? Я также попытался установить параметр _default_manager в классе Meta, но он не работает. Каков правильный способ определения пользовательского менеджера и набора запросов в django?

Заранее спасибо.

ответ

2

Вы назначили своего менеджера на manager в ActivableModel, а не на objects.

+0

Я не хочу иметь объекты в качестве менеджера в моей модели. Но для этого нужен код рамки django rest. Есть ли выход? –

+0

Почему ты этого не хочешь? –

+0

Я определил пользовательский менеджер и набор запросов. Я хочу установить экземпляр настраиваемого менеджера для объектов. Но поскольку объекты не так значимы, я хочу использовать другой термин, например «менеджер». Но он не работает с django-rest, поскольку он ожидает «объектов» в классе модели. Есть ли способ смягчить его? Также дайте мне знать, если я делаю что-то неправильно или есть лучший способ сделать это. Более того, укажите его в своем ответе, чтобы его можно было поддержать. –

1

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

Нет. Это делается только в том случае, если вы явно не предоставляете менеджера самостоятельно.

Кроме фильтрации результатов менеджера по умолчанию с `все QuerySet, как правило, довольно неплохо, ср https://docs.djangoproject.com/en/1.10/topics/db/managers/#default-managers

WRT/ваша проблема с BaseSerializer (там, где это происходит от), вы можете представить патч к автору с правильная реализация, которая ищет _default_manager вместо objects (см. приведенную выше ссылку), , но, так как Даниэль Роземан упоминает, назначая менеджера по умолчанию ничего, кроме objects, будет в основном раздражать (по меньшей мере) любого, кто работает над вашим кодом.