Djangotastype通道请求.用户自定义保存方法

2024-06-09 04:55:03 发布

您现在位置:Python中文网/ 问答频道 /正文

因为我的模型的自定义保存方法请求.用户作为一个论点,我不能做POST/PUT请求。在

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

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

以下是相关模型部分:

^{pr2}$

以及资源:

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

Tags: 方法用户模型apitrueputpostcomments
2条回答

您可以重写ModelResource子类上的默认save()方法。查看default implementation可以看出,save()是用一个bundle对象调用的,该对象既有请求,也有要保存的对象。在

不幸的是,在不复制大部分代码的情况下,没有一种简单的方法可以更改这一点,因为更改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

参考文献:

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

我有一个通过FriendResource公开的Friend模型,我想通过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

希望有帮助!在

相关问题 更多 >