现在试图让它运行一段时间。 基本上我有一个休息api作为后端返回json,一切都很好。
我遇到的问题是骨干关系问题。我确定我刚收到了什么 错了,但我一直在寻找网络一段时间,找不到任何帮助。
我试图在“职业”和“武器”模型之间建立很多关系。 这是我的代码:
Profession = Backbone.RelationalModel.extend({
urlRoot: '../api/professions',
relations: [{
type: Backbone.HasMany,
key: 'weapons',
relatedModel: 'Weapon',
collectionType: 'Weapons',
reverseRelation: {
key: 'profession',
includeInJSON: 'id',
keySource: 'profession_id'
}
}]
});
Weapon = Backbone.RelationalModel.extend({
urlRoot: '../api/weapons'
});
Weapons = Backbone.Collection.extend({
model: Weapon,
url: function(models){
return '../api/weapons';
}
});
对这些api端点的调用会返回:
{name: "Profession1", id: 1}
[{name: "Weapon1", profession_id: 1}, {name: "Weapon2", profession_id: 1}]
所以,如果我理解正确,profession.fetchRelated('weapons')
应该将httprequest发送到武器集合的url并拉出具有profession_id为1的对象。但是当我运行profession.fetchRelated('weapons')
时没有任何反应
答案 0 :(得分:9)
所以,如果我理解正确一个profession.fetchRelated('武器')应该发送一个httprequest到武器集合的url并拉出具有profession_id为1的对象。但是当我运行profession.fetchRelated时没有任何反应(的武器')
这不是我理解Backbone-relational工作的方式 - 我注意到我正在使用旧版本,并且尚未调查最新版本。
根据我的理解,Backbone-relational需要的数据看起来与您的API响应不同。
我认为Backbone-relational想要在父模型响应中引用嵌套模型,要么完全嵌套:
{
name: "Profession1",
id: 1,
weapons: [
{name: "Weapon1", profession_id: 1},
{name: "Weapon2", profession_id: 1}
]
}
在这种情况下,它将完全填充嵌套模型。
或者,作为参考:
{
name: "Profession1",
id: 1,
weapons: ['weapon1','weapon2']
}
在这种情况下,Backbone-relational会在内部存储相关的键,但会显示一个空集合。然后,您将使用fetchRelated
获取相关模型的完整数据:
assassin.fetchRelated('weapons')
请求标识'weapon1'
和'weapon2'
的武器,作为单独的请求,或者如果您的API接受设置请求,单个请求,请求响应类似:
{id: 'weapon1', name: "Weapon1", profession_id: 1}
我不是,我不知道是否有一种快速,内置的方式来处理您的API响应,然后编写自定义函数。
答案 1 :(得分:2)
为了补充爱德华写的内容,这里是你如何让fetchRelated工作的。首先,正如Edward声称的那样,如果您的API已经嵌套了JSON响应中的数据,则fetchRelated将不返回任何内容。因此,如果在Django-Tastypie中,您的资源设置为使用full = True:
movies = fields.ToManyField('movie.api.MovieResource', 'user', full=True)
然后就像,
myuser.fetchRelated("movies")
将不返回任何内容,因为相关数据已经包含在JSON响应中。但是当你尝试做一些延迟加载时,fetch相关的特别有用。因此,如果您的Django-Tastypie字段中有full = False,并且您的JSON响应仅包含该条目的id和资源URI,则可以使用fetchRelated来实际填充该数据。
myuser = new User({id: 1})
myuser.fetch()
myuser.fetchRelated("movies")
现在您可以访问相关的电影集。如果您还使用Tastypie-Backbone插件,则无需担心在Collection中构造特殊的URL return语句。它使用tastypie select语法/ 2; 3; 7
为您完成所有操作