Как получить объект авторизованного пользователя в django-tastypie

Мне нужно получить авторизованный пользовательский объект в методе гидрата, что-то вроде этого:

class SalepointResource(ModelResource):
  def hydrate(self, bundle):
    user = bundle.request.user

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


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


Ответы (3)


С TastyPie 0.9.15 я обнаружил, что это работает:

def hydrate_user(self, bundle):
    bundle.obj.user = bundle.request.user
    return bundle

без необходимости создания подкласса ModelResource. Здесь user — это ForeignKey модели и ресурса. Я публикую это как ответ, потому что, хотя это выглядит просто, мне потребовалось много времени, чтобы понять.

person Racing Tadpole    schedule 29.07.2013

Вы правильно настроили аутентификацию/авторизацию в deliciouspie?

person scytale    schedule 20.03.2012
comment
Да, и аутентификация и авторизация установлены, работает исправно. - person Kirill Bubochkin; 20.03.2012
comment
Вы когда-нибудь находили решение? - person Greg Hinch; 08.09.2012

Не уверен, что это лучший подход, но я решил эту проблему, создав подкласс класса ModelResource и переопределив некоторые из его методов. В ModelResource объект request (который содержит user) является параметром метода obj_update, но не передается методу full_hydrate, который, в свою очередь, вызывает hydrate. Вы должны внести несколько небольших изменений в каждый из этих методов, чтобы передать объект request по всей цепочке.

Модификации метода тривиальны. В деталях:

from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError
from tastypie.resources import ModelResource
from tastypie.exceptions import NotFound, BadRequest, InvalidFilterError, HydrationError, InvalidSortError, ImmediateHttpResponse

class MyModelResource(ModelResource):
    def obj_create(self, bundle, request=None, **kwargs):
        ...
        bundle = self.full_hydrate(bundle, request)
        ...

    def obj_update(self, bundle, request=None, **kwargs):
        ...
        bundle = self.full_hydrate(bundle, request)
        ...

    def full_hydrate(self, bundle, request=None):
        ...
        bundle = self.hydrate(bundle, request)
        ...

    def hydrate(self, bundle, request=None):
        ...
        return bundle

Затем сделайте свой ресурс подклассом этого нового класса и переопределите новую версию hydrate:

class MyModelResource(MyModelResource):
    class Meta:
        queryset = MyModel.objects.all()

    def hydrate(self, bundle, request):
        bundle.obj.updated_by_id = request.user.id
        return bundle

Я не проверял это полностью, но, похоже, пока работает. Надеюсь, поможет.

person David Jones - iPushPull    schedule 19.09.2012