5

一直在尝试启动并运行一段时间。基本上我有一个rest 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')应该向武器集合的 url 发送一个 httprequest,并拉出一个professional_id 为 1 的对象。但是当我运行时没有任何反应profession.fetchRelated('weapons')

4

2 回答 2

9

所以,如果我理解正确,professional.fetchRelated('weapons') 应该向武器集合的 url 发送一个 httprequest 并拉出一个 professional_id 为 1 的对象。但是当我运行professional.fetchRelated('weapons') 时没有任何反应)

这不是我理解 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')

哪个请求带有 id'weapon1'和的武器'weapon2',可以作为单独的请求,或者如果您的 API 接受一个集合请求,单个请求,期望响应如下:

{id: 'weapon1', name: "Weapon1", profession_id: 1}

除了编写自定义函数之外,我不知道是否有一种快速、内置的方式来处理您的 API 响应。

于 2012-03-15T14:34:54.757 回答
2

为了补充 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;3;7 的美味派选择语法为您完成所有工作

于 2012-05-23T22:55:33.233 回答