的Django + tastypie + mongoengine + 500错误与Backbone.js的&骨干,tastypie.js

问题描述:

节能模式这是试图做一个简单的与主干模型保存时,我收到了错误:的Django + tastypie + mongoengine + 500错误与Backbone.js的&骨干,tastypie.js

{"error_message": "Could not save document (Mod on _id not allowed)", "traceback": "Traceback (most recent call last):\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\", line 195, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\", line 435, in dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\", line 390, in dispatch\n return 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_mongoengine/resources.py\", line 360, in _wrap_request\n return fun()\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\", line 390, in \n return 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\", line 458, in dispatch\n response = method(request, **kwargs)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\", line 1408, in put_detail\n updated_bundle = self.obj_update(bundle=bundle, **self.remove_api_resource_names(kwargs))\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\", line 561, in obj_update\n return self.save(bundle, skip_errors=skip_errors)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie_mongoengine/resources.py\", line 578, in save\n return super(MongoEngineResource, self).save(bundle, skip_errors)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/tastypie/resources.py\", line 2230, in save\n bundle.obj.save()\n\n File \"../thecontractbox/apps/staff/models.py\", line 811, in save\n return super(MHRBoxEmployee, self).save(*args, **kwargs)\n\n File \"/Users/mbp/Projects/env/employii/lib/python2.7/site-packages/mongoengine/document.py\", line 294, in save\n raise OperationError(message % unicode(err))\n\nOperationError: Could not save document (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}); 
} 

CLE arly这是由于模型ID不允许被修改,但tastypie试图修改造成的。我使用以下版本:

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

_id是如何改变的?这是因为它的字符串,而不是被转换为ObjectId? – Ross

嗯,我觉得很难相信,这是我可以让它正常工作的唯一途径,但目前这是一个解决方案:

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},它只是部分更新模型。

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