fetch, связанный, не извлекающий связанный - PullRequest
5 голосов
/ 15 марта 2012

Пытаюсь сейчас это запустить и запустить. В основном, у меня есть 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-адрес для сбора оружия и вытащить объект, у которого профессио-идентификатор равен 1. Но ничего не происходит, когда я запускаю profession.fetchRelated('weapons')

Ответы [ 2 ]

9 голосов
/ 15 марта 2012

Итак, если я правильно понимаю, профессию.fetchRelated («оружие») следует отправить httprequest на URL для сбора оружия и вытащить объект, у которого профессио_ид равен 1. Но ничего не происходит, когда я запускаю профессию.fetchRelated ('Weapons')

Это не то, как я понимаю Backbone-реляционный для работы - с оговоркой, что я работаю со старой версией, и еще не исследовал последние версии.

Насколько я понимаю, Backbone-реляционным нужны данные, которые выглядят не так, как ваши ответы API.

Я думаю, что Backbone-реляционным нужны ссылки на вложенные модели в ответе родительской модели, либо полностью вложенные:

{
  name: "Profession1", 
  id: 1, 
  weapons: [
    {name: "Weapon1", profession_id: 1}, 
    {name: "Weapon2", profession_id: 1}
  ]
}

В этом случае он будет полностью заполнять вложенные модели.

Или в качестве ссылок:

{
  name: "Profession1", 
  id: 1, 
  weapons: ['weapon1','weapon2']
}

В этом случае Backbone-реляционный будет хранитьсвязанные ключи внутри, но представляют пустую коллекцию.Затем вы должны использовать fetchRelated для получения полных данных для соответствующих моделей:

assassin.fetchRelated('weapons')

, которые делают запрос на оружие с идентификатором 'weapon1' и 'weapon2', либо в качестве отдельных запросов, либо, если вашAPI принимает заданный запрос, один запрос, ожидая, что ответ будет примерно таким:

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

Я не знаю, насколько быстро я знаю, есть ли быстрый, встроенный способ работы сваши ответы API, кроме того, чтобы написать пользовательскую функцию.

2 голосов
/ 24 мая 2012

Чтобы добавить к тому, что написал Эдвард, вот как вы можете получить fetch, связанный с работой. Во-первых, как утверждал Эдвард, fetchRelated ничего не вернет, если ваш API уже вложит данные в ответ JSON. Итак, если в Django-Tastypie ваш ресурс настроен на использование full = True:

movies = fields.ToManyField('movie.api.MovieResource', 'user', full=True)

тогда что-то вроде

myuser.fetchRelated("movies")

ничего не вернет, потому что связанные данные уже будут включены в ответ JSON. Но где выборка особенно полезна, когда вы пытаетесь выполнить ленивую загрузку. Итак, если у вас в поле Django-Tastypie задано значение full = False, а ваш ответ JSON включает только идентификаторы и URI ресурса для этой записи, вы можете использовать fetchRelated для фактического заполнения этих данных.

myuser = new User({id: 1})
myuser.fetch()
myuser.fetchRelated("movies")

И теперь у вас есть доступ к соответствующей коллекции фильмов. Если вы также используете плагин Tastypie-Backbone, вам не нужно беспокоиться о создании специального оператора возврата URL в Коллекции. Это все для вас, используя синтаксис вкусных пирогов / 2; 3; 7

...