Как получить авторизованный пользовательский объект в django-tastypie - PullRequest
3 голосов
/ 20 марта 2012

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

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

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

Ответы [ 3 ]

0 голосов
/ 20 сентября 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

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

0 голосов
/ 29 июля 2013

С TastyPie 0.9.15 я считаю, что это работает:

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

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

0 голосов
/ 20 марта 2012

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

...