我正在使用django tastypie的骨干关系,我对验证关系有问题。
假设我有一个带验证方法的基本模型:
MyModel = Backbone.RelationalModel.extend({
urlRoot : '/api/v1/SampleModel/',
relations : [
{
type: Backbone.HasOne,
key: 'box',
relatedModel: 'BoxModel',
includeInJSON: 'id'
}],
validate : function(attr)
{
if(!attr.name)
{
console.log('attr name validation fail');
return "C mon! name is srsly required!";
}
if(!attr.box)
{
console.log('attr box validation fail');
console.log(attr.box);
return "Damn! you forgot to set box!";
}
}
});
在某些视图中,我正在使用box
创建新的MyModel实例作为其他对象的resource_uri:
var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');
,这是meritum ...当我在模型上save
时,它总是在attr.box
验证失败而attr.box
是None
- 即使所有字段都设置了正确。
有趣的是,如果在validate
函数中,请执行以下操作:
validate : function(attr){
if(!attr.name)
{
console.log('attr name validation fail');
return "C mon! name is srsly required!";
}
console.log(attr.box);
}
在上述情况下,attr.box
在控制台中显示为所需对象。
当然,如果我删除验证方法,对象会正确保存,并有适当的关系等。
正如我在文档中所说的那样,默认情况下,只有在调用save()
时才会运行验证,因此所有字段都已设置..所以validation
函数如何(和为什么)知道,{{{ 1}}是空的吗?
或许我的方法完全错了?
感谢任何线索。
答案 0 :(得分:0)
您正在错误的对象中设置值:
var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri); // NewModel instead of MyModel
NewModel.set('name','new name for model'); // NewModel instead of MyModel
您的问题出在其他地方,here我设置了一个效果良好的示例。
顺便说一下,将relatedModel: 'BoxModel',
更改为relatedModel: BoxModel,
答案 1 :(得分:0)
可能我找到了解决方案。
模型定义中的修改:
MyModel = Backbone.RelationalModel.extend({
idAttribute : 'id', //here i added declaration of id field
urlRoot : '/api/v1/SampleModel/',
relations : [
{
type: Backbone.HasOne,
key: 'box',
relatedModel: 'BoxModel',
includeInJSON: 'resource_uri' // changed 'id' to 'resource_uri' probably it's not required at all
}],
validate : function(attr)
{
if(!attr.name)
{
console.log('attr name validation fail');
return "C mon! name is srsly required!";
}
if(!attr.box)
{
console.log('attr box validation fail');
console.log(attr.box);
return "Damn! you forgot to set box!";
}
}
});
在视图中,我在模型中设置了id而不是resource_uri:
var BoxUri = '3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');
经过这两次修改后,验证开始起作用。