Django tastypie-自动获取当前的用户资源



在我的帖子方法上,我想自动使用当前用户填充'所有者'字段(我正在使用BasicAuthentication)。我在此处遵循一些代码:如何在Django -Tastypie中获取授权的用户对象 - 但我还没有很好地工作。

Resources.py:

class QuestionResource(ModelResource):
    owner = fields.ForeignKey(UserResource, 'owner')
    class Meta:
        queryset = Question.objects.all()
        allowed_methods = ['get','post']
        fields = ['title','type']
        resource_name = 'question'
        include_resource_uri = True
        serializer = PrettyJSONSerializer()
        authentication = BasicAuthentication()
        authorization = Authorization()
    def obj_create(self, bundle, request=None, **kwargs):
        bundle = self.full_hydrate(bundle, request)
        return bundle
    def obj_update(self, bundle, request=None, **kwargs):
        bundle = self.full_hydrate(bundle, request)
        return bundle
    def full_hydrate(self, bundle, request=None):
        bundle = self.hydrate(bundle, request)
        return bundle
    def hydrate(self, bundle, request=None):
        bundle.obj.owner = User.objects.get(pk = request.user.id)
        return bundle

如果我发表以下内容:

curl -u USERNAME:XXXXXXX --dump-header - -H "Accept: application/json" -H "Content-Type: application/json" -X POST --data "{"title":"my new question","type":"multichoice"}" http://localhost/python/mquiz/api/v1/question/

我得到响应:

HTTP/1.1 201 CREATED
Date: Fri, 02 Nov 2012 08:28:05 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Language,Cookie,Accept-Encoding
Location: http://localhost/python/mquiz/api/v1/question/None/
Content-Language: en-us
Content-Length: 0
Content-Type: text/html; charset=utf-8

因此,它看起来好像已经有效,但是数据库中没有任何添加的位置,并且位置看起来不正确(末尾/无/)。

我敢肯定,这与" bundle.obj.owner = user.objects.get(pk = request.user.id)"行有关。如果我使用" bundle.obj.owner = request.user.id",则会得到错误:

"error_message": "Cannot assign "3L": "Question.owner" must be a "User" instance."

据我所知,捆绑包。我的curl请求(并删除我的自定义水合方法),然后一切正常,并添加到数据库中。那么如何将我的用户实例转换为将要接受的表格?

任何帮助。

啊...现在已经弄清楚了。有效的方法:

class QuestionResource(ModelResource):
    owner = fields.ForeignKey(UserResource, 'owner')
    class Meta:
        queryset = Question.objects.all()
        allowed_methods = ['get','post']
        fields = ['title','type']
        resource_name = 'question'
        include_resource_uri = True
        serializer = PrettyJSONSerializer()
        authentication = BasicAuthentication()
        authorization = Authorization()

    def hydrate(self, bundle, request=None):
        bundle.obj.owner = User.objects.get(pk = bundle.request.user.id)
        return bundle 

我需要bundle.request.user.id,而不仅仅是request.user.id。也许我正在考虑的另一个问题是转介到较旧版本的tastypie-似乎较旧的版本在捆绑包中无法访问吗?

当前验证的答案是次优的,因为它产生了2个SQL查询。

您宁愿修改QuerySet如下:

queryset = Question.objects.select_related('owner').all()

这样,"所有者"数据以一个SQL查询加入。

最新更新