2015-05-05 3 views
-1

Я понимаю роль Managers в Django при перечислении или фильтрации данных. Однако, когда речь идет о сохранении данных на модели, которую я часто видим следующие два способа используются ...Как использовать Менеджеров для сохранения данных в Django

Использование диспетчера:

class Project(TimeStampedModel): 
    stuff 

    def save(self, **kwargs): 
     Action.objects.log_action(user=self.user,comment="Saves a project") 

Не используя менеджер:

class Project(TimeStampedModel): 
    stuff 

    def save(self, **kwargs): 
     action = Action(user=self.user,comment="Saves a project") 
     action.save 

Так мой вопрос, учитывая приведенный выше сценарий, который является правильным?

ответ

1

Я считаю, что оба они в порядке. Тем не менее, я предпочитаю абстрагироваться от всей бизнес-логики, так что нам даже не нужно знать, как ведется регистрация действий.

При вызове log_action я скрываю детали реализации, которые должны быть переданы, когда.

Если я не использовал log_action, я мог бы быть забыт, что где-то в моем коде я мог бы сохранить объект под другой логикой.

Итак, вернувшись к вашему вопросу, я полагал, что это не так много, чтобы использовать Диспетчер для сохранения данных, а скорее как абстрагировать бизнес-логику.

+0

Итак, в приведенном выше случае вы должны использовать опцию Manager? – Prometheus

+1

Да, :-) Если у вас есть другие модели где-то в вашем проекте, которые требуют 'log_action', эта модель должна дублировать логику' log_action', если вы не отринули ее в менеджере. – Yeo

1

Менеджеры предназначены для класса. Сохранение - это действие уровня экземпляра.

Что вы вызываете save Фактически существует create действие, которое по умолчанию задано классом Manager.

+0

Итак, если у Django есть '' Model.objects.create() '' они используют менеджер для сохранения? – Prometheus

+1

, когда вы вызываете ['create()' Queryset method] (https://github.com/django/django/blob/1.8c1/django/db/models/query.py#L341-L349), он будет вызывать [ 'save() Метод модели'] (https://github.com/django/django/blob/1.8c1/django/db/models/base.py#L654-L748), который делает тяжелую работу при вставке таблицы. – Yeo

 Смежные вопросы

  • Нет связанных вопросов^_^