2012-03-15 7 views
5

He estado intentando poner esto en funcionamiento desde hace un tiempo. Básicamente tengo una API de reposo como back-end que devuelve json, todo bien.fetchRelated not fetching related

El problema que tengo es con backbone-relational. Estoy seguro de que me equivoqué con algo pero he estado buscando en las redes por un tiempo y no he podido encontrar nada para ayudar.

Estoy tratando de obtener una relación entre el modelo "Profesión" y "Arma". Aquí está mi código para que:

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'; 
    } 
}); 

y un llamado a aquellos parámetros API muestra:

{name: "Profession1", id: 1} 

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

Por lo tanto, si he entendido bien un profession.fetchRelated('weapons') deben enviar un HttpRequest a la dirección URL de la colección de armas y tirar el objeto que tiene un profession_id de 1. Pero no pasa nada cuando ejecuto profession.fetchRelated('weapons')

Respuesta

9

Por lo tanto, si entiendo correctamente un profession.fetchRelated ('arma s ') debe enviar un HttpRequest a la dirección URL de la colección de armas y tirar del objeto que tiene un profession_id de 1. Sin embargo, no ocurre nada cuando corro profession.fetchRelated (' armas)

Esto no es como yo entiendo Backbone-relational to work - con la advertencia de que estoy trabajando con una versión anterior, y aún no he investigado las últimas versiones.

Según mi entender, Backbone-relational quiere datos que se vean diferentes a las respuestas de su API.

creo que Backbone-relacional quiere referencias a modelos anidados en la respuesta del modelo de los padres, ya sea totalmente anidado:

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

En cuyo caso, se rellenará completamente los modelos anidados.

O, como referencias:

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

En cuyo caso Backbone-relacional esconder las claves relacionadas internamente, sino presentar una colección vacía. A continuación, utilizar fetchRelated a buscar los datos completos para los modelos relacionados:

assassin.fetchRelated('weapons') 

que hacen una solicitud de armas con id 'weapon1' y 'weapon2', ya sea como solicitudes individuales, o si su API acepta una solicitud de conjunto, una sola solicitud, esperando un algo respuesta como:

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

yo no, la parte superior de la cabeza, saber si hay una manera rápida, una función de trabajar con sus respuestas del API, aparte de escribir una costumbre función.

+0

Gracias por la aclaración. Tal vez debería simplemente cambiar la respuesta de la API para incluir los modelos anidados, ya que quiero que estén disponibles tan pronto como se obtenga la "profesión". – JonasFromell

+0

El problema que encuentro es cuando tienes docenas de profesiones, cada una con docenas de armas superpuestas. Incluir el objeto arma completo con cada profesión genera una gran cantidad de datos redundantes. Es genial para este pequeño ejemplo, pero para una aplicación grande, no es tan factible. –

2

Para agregar a lo que Edward escribió, así es cómo puedes obtener fetchRelated to work. En primer lugar, como afirmó Edward, fetchRelated no devolverá nada si su API ya anida los datos en la respuesta JSON.Por lo tanto, si en Django-Tastypie que tenga su recurso configurado para utilizar plena = True:

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

entonces algo así como,

myuser.fetchRelated("movies") 

volverá nada porque los datos relacionados ya estarán incluidas en el Respuesta JSON. Pero donde fetch related es particularmente útil es cuando intentas realizar una carga diferida. Entonces, si tiene full = False en su campo Django-Tastypie, y su respuesta JSON solo incluye el identificador de usuario y el URI de recursos a esa entrada, puede usar fetchRelated para completar realmente esos datos.

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

Y ahora tiene acceso a la colección de películas relacionada. Si también está utilizando el complemento Tastypie-Backbone, no necesita preocuparse por construir una declaración de devolución de URL especial en la Colección. Lo hace todo por ti usando la sintaxis de selección sabrosa de/2; 3; 7