fetchRelated没有提取相关

时间:2012-03-15 06:56:03

标签: javascript backbone.js backbone-relational

现在试图让它运行一段时间。 基本上我有一个休息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')时没有任何反应

2 个答案:

答案 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

为您完成所有操作