fetchRelated与获取无关



我已经试着让它运行了一段时间。基本上,我有一个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

相关内容

  • 没有找到相关文章