首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Tastypie,ManyToMany保存错误

Django Tastypie,ManyToMany保存错误
EN

Stack Overflow用户
提问于 2012-07-01 01:24:48
回答 1查看 3.7K关注 0票数 2

我有一个问题,当我保存一个项目时,通过品味api。(POST方法)

这是我的api.py代码。

代码语言:javascript
复制
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
from tastypie.authorization import DjangoAuthorization
from tastypie.authentication import BasicAuthentication
from tastypie import fields
from apps.clients.models import Client
from django.contrib.auth.models import User

class ClientAPI(ModelResource):
    users = fields.ToManyField('apps.clients.api.ClientUserAPI', 'users',related_name='entry',full=True)


    class Meta:
        queryset = Client.objects.all()
        resource_name="clients"
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()
        filtering={
            "users":ALL
        }

    def hydrate_m2m(self,bundle):
        if bundle.data.get("users"):
            for user_id in bundle.data["users"]:
                new_user = User.objects.get(id=user_id)
                bundle.obj.users.add(new_user)


class ClientUserAPI(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'users'
        fields = ['username', 'first_name', 'last_name', 'last_login']
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

当即时消息发布数据时,保存成功,但给我错误。

代码语言:javascript
复制
{"error_message": "'NoneType' object has no attribute 'obj'", "traceback": "Traceback (most recent call last):\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 397, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1165, in post_list\n updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1784, in obj_create\n self.save_m2m(m2m_bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1942, in save_m2m\n related_mngr = getattr(bundle.obj, field_object.attribute)\n\nAttributeError: 'NoneType' object has no attribute 'obj'\n"}

当我将"return bundle“行添加到hydrate_m2m时,m2m保存不成功(空白),仍然给我这样的错误。

代码语言:javascript
复制
{"error_message": "'str' object has no attribute 'obj'", "traceback": "Traceback (most recent call last):\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 397, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1165, in post_list\n updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1784, in obj_create\n self.save_m2m(m2m_bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1951, in save_m2m\n related_bundle.obj.save()\n\nAttributeError: 'str' object has no attribute 'obj'\n"}

当我从代码中删除hydrate_m2m时,返回的错误是:

代码语言:javascript
复制
{"error_message": "The URL provided '1' was not a link to a valid resource.", "traceback": "Traceback (most recent call last):\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 397, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1165, in post_list\n updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 1783, in obj_create\n m2m_bundle = self.hydrate_m2m(bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 743, in hydrate_m2m\n bundle.data[field_name] = field_object.hydrate_m2m(bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/fields.py\", line 742, in hydrate_m2m\n m2m_hydrated.append(self.build_related_resource(value, **kwargs))\n\n File \"/Library/Python/2.7/site-packages/tastypie/fields.py\", line 588, in build_related_resource\n return self.resource_from_uri(self.fk_resource, value, **kwargs)\n\n File \"/Library/Python/2.7/site-packages/tastypie/fields.py\", line 522, in resource_from_uri\n obj = fk_resource.get_via_uri(uri, request=request)\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", line 636, in get_via_uri\n raise NotFound(\"The URL provided '%s' was not a link to a valid resource.\" % uri)\n\nNotFound: The URL provided '1' was not a link to a valid resource.\n"}

我认为提供"1“的URL是用户id。

请告诉我。我做错了什么?

顺便说一句,我不太懂英语,很抱歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-05 06:29:50

我很确定,你是用逗号分隔的id来发布用户资源的,这不是默认情况下tastypie处理相关资源的方式。你应该发布一个urls列表,指向相关的资源,在你的例子中是- smth,比如'/api/v1/users/1‘。

或者,您可以将hydrate_m2m更改为hydrate_users。泛型hydrate_m2m遍历资源中的每个字段,并尝试将其从url-string转换为相关资源的实例(这就是为什么您会得到有关“提供的URL”的错误)。hydrate_users的代码可能如下所示:

代码语言:javascript
复制
def hydrate_users(self, bundle):
    try:
        user_ids = map(int, bundle.data.get('users', []))
    except ValueError:
        raise BadRequest("User ids must be ints") # from tastypie.exceptions
    bundle.data['users'] = User.objects.filter(id__in=user_ids)
    return bundle

希望这能有所帮助

编辑:按照卡森的建议,删除了lambda,转而支持int

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11276099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档