Как запустить метод, который будет выполняться перед гидратом в django-tastypie

Мне нужна следующая логика: Пользователь отправляет объекты на сервер, но мне нужно, чтобы объекты, которые он разместил ранее, удалялись до создания новых объектов. Есть ли какой-то метод, который называется, например. перед методом Hydrate(), в котором я мог бы получить доступ к объекту авторизованного пользователя?


person Kirill Bubochkin    schedule 21.03.2012    source источник


Ответы (1)


Если ваша проблема связана с созданием, вы можете переопределить метод obj_create. Ему предоставляется объект запроса, поэтому вы можете получить доступ к request.user. Что-то вроде этого должно работать для вас:

class SomeResource( ... ):

    def obj_create(self, bundle, request=None, **kwargs):
        user = request.user if request else None
        # ...
        if user:
            # delete objects here
        # ...
        super( SomeResource, self ).obj_create( bundle, request, **kwargs ) 
person kgr    schedule 21.03.2012
comment
obj_create будет запускаться для каждого объекта, и мне нужно запустить этот код только один раз, в начале обработки запроса... - person Kirill Bubochkin; 22.03.2012
comment
Затем переопределите dispatch() и поместите свой код где-нибудь перед response = method(request, **kwargs). У вас также есть запрос, но он выполняется один раз для каждого запроса. - person kgr; 22.03.2012
comment
Да, это может сработать. Также я нашел другой способ: переопределить patch_list(). К сожалению, либо в dispatch(), либо в patch_list() у меня есть объект запроса до авторизации, поэтому у меня нет объекта User. Но это частично решает мою проблему. - person Kirill Bubochkin; 26.03.2012
comment
dispatch() выполняет аутентификацию и авторизацию, поэтому, возможно, если вы добавите свой код в нужное место, он будет работать (после аутентификации)? Другая идея, которую я получил, состоит в том, чтобы изменить obj_create() (что логически является хорошим местом), но где-то иметь флаг, который обозначает, является ли это первым или нет созданием в данном запросе (чтобы избежать проблемы с несколькими вызовами, которые вы упомянули). Надеюсь это поможет :) - person kgr; 26.03.2012