【问题标题】:Django + tastypie + mongoengine + 500 error on saving model with backbone.js & backbone-tastypie.jsDjango + sweetpie + mongoengine + 使用backbone.js 和backbone-tastypie.js 保存模型时出现500 错误
【发布时间】:2014-02-15 18:34:44
【问题描述】:

这是我在尝试使用主干模型进行简单保存时收到的错误:

{"error_message": "无法保存文档 (Mod on _id not allowed)", "traceback": "Traceback (最近一次调用最后一次):\n\n File \"/Users/mbp/Projects/env /employii/lib/python2.7/site-packages/tastypie/resources.py\",第 195 行,在包装器中\n response = callback(request, *args, **kwargs)\n\n File \"/Users /mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\",第 435 行,在 dispatch_detail\n return self.dispatch('detail', request, **kwargs)\ n\n 文件 \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\",第 390 行,在调度中\n return self._wrap_request(request, lambda : super(MongoEngineResource, self).dispatch(request_type, request, **kwargs))\n\n 文件\"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources .py\",第 360 行,在 _wrap_request\n return fun()\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\ ”,林e 390, 在 \n 返回 self._wrap_request(request, lambda: super(MongoEngineResource, self).dispatch(request_type, request, **kwargs))\n\n File \"/Users/mbp/Projects/env/employii /lib/python2.7/site-packages/tastypie/resources.py\",第 458 行,在 dispatch\n response = method(request, **kwargs)\n\n File \"/Users/mbp/Projects/ env/employii/lib/python2.7/site-packages/tastypie/resources.py\",第 1408 行,在 put_detail\n updated_bundle = self.obj_update(bundle=bundle, **self.remove_api_resource_names(kwargs))\n \n 文件 \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\",第 561 行,在 obj_update\n return self.save(bundle, skip_errors= skip_errors)\n\n 文件 \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\",第 578 行,保存中\n 返回 super(MongoEngineResource, self).save(bundle, skip_errors)\n\n 文件\"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\",第 2230 行,保存中\n bundle.obj.save()\n\n 文件 \"../thecontractbox/apps/staff/models.py\",第 811 行,保存中\n return super(MHRBoxEmployee, self) .save(*args, **kwargs)\n\n 文件\"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/mongoengine/document.py\",第 294 行,在保存\n raise OperationError(message % unicode(err))\n\nOperationError: 无法保存文档(Mod on _id not allowed)\n"}

主干代码:

RAVE.Models.StaffModel = Backbone.Model.extend({
    urlRoot : '/m/api/v1/empployee',

    defaults: function() {
         return {
             active : true,
             visible : true
         };
    },
});

var StaffCollection = Backbone.Collection.extend({
    url : function(){
         return  '/m/api/v1/empployee/';
    },

    model: RAVE.Models.StaffModel,
});

这是从破坏它的主干视图调用的代码:

if( this.model.get('has_access') ){
     this.model.save({'has_access' : false});
}
else{
     this.model.save({'has_access' : true});
}

很明显,这是因为模型 id 不允许修改,但 sweetpie 正在尝试修改。我正在使用以下版本:

django-tastypie==0.10.0
django-tastypie-mongoengine==0.4.2
mongoengine==0.8.4
Django==1.5

【问题讨论】:

  • _id 是如何变化的?是因为它是一个字符串而不是被转换为 ObjectId 吗?

标签: javascript django backbone.js mongoengine tastypie


【解决方案1】:

嗯,我很难相信这是我让它正常工作的唯一方法,但目前这是一个解决方案:

 if( this.model.get('has_access') ){
      this.model.save({'has_access' : false}, {patch : true});
 }
 else{
      this.model.save({'has_access' : true}, {patch : true});
 }

通过在每次保存时传递 {patch : true},它只是部分更新模型。

我仍在等待任何其他解决方案或有人确认我当前的修复方法是否正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2023-03-05
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多