0

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

TypeError at /api/obsadmin/observation/23
save() takes at least 2 arguments (1 given)

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

这是相关的模型部分:

def save(self, user, owner=None, *args, **kwargs):
    self.updated_by = user.id
    super(ObsModel, self).save(*args, **kwargs)

和资源:

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
4

2 回答 2

5

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

我有一个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

希望有帮助!

于 2014-02-21T14:03:04.210 回答
2

您可以覆盖子类的默认save()方法ModelResource。查看默认实现表明它save()是使用具有请求和要保存的对象的捆绑对象调用的。

不幸的是,如果不复制大部分代码,就没有简单的方法来更改它,因为更改 Django 模型的save()签名相当少见。你也许可以做这样的事情,虽然我建议仔细测试它:

from functools import partial

try:
    old_save = bundle.obj.save
    bundle.obj.save = partial(old_save, user=bundle.request.user)
    return super(FooResource, self).save(bundle)
finally:
    bundle.obj.save = old_save

参考:

于 2013-04-15T18:09:38.583 回答