Django Tastypie PATCH 抛出 "' Bundle' 对象不可迭代”错误

标签 django api rest patch tastypie

我正在开发一个 API,并且我希望能够对我的一个端点进行部分更新。

这是 Tastypie 资源

class StoryResource(ModelResource):
    authors = fields.ToManyField(SimpleAuthorResource, 'authors', full=True)
    posts = fields.ToManyField(SimplePostResource, 'posts', full=True, blank=True)
    cover_photo = fields.ForeignKey(PhotoResource, 'cover_photo', full=True)
    class Meta:
        queryset = Story.objects.all()
        resource_name = 'story'
        validation = ModelFormValidation(form_class=StoryForm)
        authorization = Authorization()
        allowed_methods = ['get', 'post', 'patch', 'put']
        ordering = ['-created_ts']
    def determine_format(self, request):
        return "application/json"

我正在使用 POSTMAN 发出 PATCH 请求来更新 Story 模型中的字段。

返回时出现以下错误:

{"error_message": "'Bundle' object is not iterable", "traceback": "Traceback (most recent call last):\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 406, in dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 1332, in patch_detail\n self.update_in_place(request, bundle, deserialized)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 1345, in update_in_place\n self.is_valid(original_bundle, request)\n\n File \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\", line 991, in is_valid\n errors = self._meta.validation.is_valid(bundle, request)\n\n File \"/var/www/novella-django/novella/novella/api/validation.py\", line 55, in is_valid\n data[field] = self.uri_to_pk(data[field])\n\n File \"/var/www/novella-django/novella/novella/api/validation.py\", line 29, in uri_to_pk\n for one_uri in uris:\n\nTypeError: 'Bundle' object is not iterable\n"}

我不太确定出了什么问题,而且我似乎在其他地方找不到这个错误。

最佳答案

听起来您的验证正在尝试使用以下行迭代外键包:

for one_uri in uris:

这就是“Bundle”对象不可迭代的来源。如果您想将这些字段作为 resources_uris 进行迭代,请从这些 FK 字段中删除 full=True

<小时/>

如果您希望将它们保留为 full=True,则需要更新您的验证以处理这些字段的 bundle ,或者使用 exclude 将它们从验证中排除code> 在您的表单元类中:

class ModelFormValidation:
    ...

    class Meta:
        exclude = (
            authors,
            posts,
            cover_photo            
        )

关于Django Tastypie PATCH 抛出 "' Bundle' 对象不可迭代”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299575/

相关文章:

Django 嵌套序列化程序

java - Paypal 定期付款 API - 工作流程

api - Restful api 身份验证与 oauth2 混淆

iphone - 适用于 Android、iOS 的 RESTful 框架...?

javascript - django-pipeline 不压缩

python - 错误 : No module named psycopg2. 扩展 django postgresql

python - Django - 无法加载保存到数据库的图像

java - 如何设置InputStreamReader的超时时间?

java - 将帖子发布到 REST API 时出现不支持的媒体类型错误

java - 通过 REST API 控制 Jenkins