Django-tastypie将request.user传递给自定义保存方法

Obv*_*Cat 0 python django tastypie

由于我的模型的自定义保存方法将request.user作为参数,我无法执行POST/PUT请求.

TypeError at /api/obsadmin/observation/23
save() takes at least 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我正在使用SessionAuthentication()并包含CSRF令牌.

这是相关的模型部分:

def save(self, user, owner=None, *args, **kwargs):
    self.updated_by = user.id
    super(ObsModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

和资源:

class ObservationResource2(ModelResource):

comments = fields.ToManyField(CommentResource2, 'comments', full=True, null=True)

class Meta:
    queryset = Observation.objects.filter(is_verified=True)
    authentication = SessionAuthentication()
    authorization = DjangoAuthorization()
    resource_name = 'observation'
    always_return_data = True
Run Code Online (Sandbox Code Playgroud)

Big*_*sZX 5

我刚刚通过使用内置hydrate方法在保存之前修改数据实现了同样的最终目标.当前请求bundle.requesthydrate方法内部可用.请参阅此处的文档.

我有一个Friend模型暴露通过FriendResource我想链接到通过userForeignKey字段创建Django用户.

我的示例资源代码:

class FriendResource(ModelResource):
    class Meta:
        queryset = Friend.objects.all()
        resource_name = 'friend'
        excludes = ['slug',]
        authentication = SessionAuthentication()
        authorization = DjangoAuthorization()
        always_return_data = True

    def get_object_list(self, request):
        return super(FriendResource, self).get_object_list(request).filter(user=request.user)

    def hydrate(self, bundle):
        bundle.obj.user = bundle.request.user
        return bundle
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 我不再使用Tastypie(我们改用DRF),但感谢您的回答.我相信它对某人有帮助. (2认同)