Не уверен, что это лучший подход, но я решил эту проблему, подклассифицировав класс 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
Я не проверял это полностью, но этокажется, работает до сих пор.Надеюсь, это поможет.