我已经试着让它运行了一段时间。基本上,我有一个rest api作为后端,它返回json,一切都很好。
我遇到的问题是骨干关系。我确信我刚刚得到了一些东西错了,但我已经在网上搜索了一段时间,找不到任何帮助。
我想弄清楚"职业"one_answers"武器"之间有很多关系。这是我的代码:
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')
应该向武器集合的url发送httprequest,并提取professional_id为1的对象。但当我运行profession.fetchRelated('weapons')
时,什么也没发生
因此,如果我正确理解一个职业。fetchRelated('weapons')应该向武器集合的url发送httprequest,并提取profession_id为1的对象。但当我运行职业时什么都没发生。fetchRelated('weapons')
这不是我理解Backbone关系的工作方式——需要注意的是,我使用的是旧版本,还没有研究最新版本。
根据我的理解,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')
它发出一个id为'weapon1'
和'weapon2'
的武器请求,或者作为单独的请求,或者如果您的API接受一个集合请求,一个单一请求,期望得到类似以下的响应:
{id: 'weapon1', name: "Weapon1", profession_id: 1}
我不知道是否有一种快速、内置的方法来处理API响应,除了编写自定义函数。
要添加Edward所写的内容,以下是如何使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返回语句。它使用/2的tastypie-select语法为您完成所有操作;3.7