如何在Backbone.js中加载具有外键关系的子模型?

对不起,如果这有点令人费解……我还在学习Backbone.js ……

加载和保存具有子模型的Backbone模型的正确方法是什么? (我应该有子模型吗?)

例如,(原谅coffeescript),如果我有类似的东西:

class Address extends Backbone.Model urlRoot: '/api/v1/address/' url: -> return @urlRoot+@id+'/?format=json' defaults: {'city': '', 'state': ''} class Person extends Backbone.Model urlRoot: '/api/v1/person/' url: -> return @urlRoot+@id+'/?format=json' defaults: { name: 'Anon', address: new Address } ... and then I do this ... dude = new Person dude.set('id',101) dude.fetch() // Response returns {name: 'The Dude', address: '/api/v1/address/1998/'} // And now, dude.get('address') is '/api/v1/address/1998' and no Address object where = new Address where.set('id',1998) where.fetch() // Response returns {city: 'Venice', state; 'CA'} 

我想要的是说dude.fetch(),并且为了得到dude和他的地址,当我调用Backbone.sync(’update’,dude)时,我想保存这个家伙和他的地址。 怎么样?

在后端,我使用tastypie为一些SQLAlchemy表(不是Django的ORM)构建我的api,所以我有一个用于Person表和Address表的资源:

 class AddressResource(SQLAlchemyResource): class Meta: resource_name = 'address' object_class = AddressSQLAlchemyORMClass class PersonResource(SQLAlchemyResource): address = ForeignKey(AddressResource, 'address') class Meta: resource_name = 'person' object_class = PersonSQLAlchemyORMClass 

Tastypie的ForeignKey函数创建一个映射,将URL返回到相关地址。

我尝试重载Dude.parse()函数来调用Address()的fetch,但它没有工作,感觉不对,它提出了各种各样的问题:

  1. 我是否应该修改我的tastypie响应以将地址包含为嵌套对象?
  2. 如果我改为嵌套对象,我应该使用骨干关系 ,就像Backbone-Relational相关模型没有被创建的问题那样 ,还是有点矫枉过正?
  3. 我应该重载parse()或fetch()函数还是创建我自己的backbone.Sync()来获取响应然后手动执行此操作?
  4. 既然它是一对一的,我应该只使用一个模型而不是子模型,并在一个请求中一起发回信息吗?

有这样做的标准方法吗?

使用Tastypie,您可以通过在ForeignKey定义中指定full = True来将响应更改为嵌套对象而不是链接:

 class PersonResource(SQLAlchemyResource): address = ForeignKey(AddressResource, 'address', full=True) 

这将返回地址对象以及人员。

接下来,我仍然不知道这是否是最好的方法 ,但我将子模型移出属性,并重载parse()来设置它,并更新()以保存它,如:

 class Person extends Backbone.Model address: new Address urlRoot: '/api/v1/person/' url: -> return @urlRoot+@id+'/?format=json' defaults: { name: 'Anon'} parse: (response) -> addressResp = response.address || {} addressAttr = @address.parse(addressResp) @address.set(addressAttr) return response update: (options) -> @set('address',@address.toJSON()) Backbone.sync 'update', @, options 

在这个例子中,我可以将地址添加回属性并使用set / get进行管理,但是在我自己的环境中,我已经为json创建了一个备用的toJSON函数来发布到服务器,但是找不到将json设置为对象而不将其从集合更改为json响应的好方法。

Interesting Posts