如何加载子模型与Backbone.js的一个外键关系?(How do I load sub-mode

2019-09-19 12:44发布

很抱歉,如果这是一个有点令人费解......我仍然在学习Backbone.js的...

什么是加载和保存具有本身内子模型骨干模型的正确方法? (应该我甚至是具有子模型?)

例如,(原谅的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(),并且它可以同时获得这家伙和他的地址,当我打电话Backbone.sync(“更新”,老兄),我要救这两个家伙和他的地址。 怎么样?

在后端,我使用tastypie构建我的API对于一些SQLAlchemy的表(不Django的ORM),所以我有我的个人表和地址表的资源:

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()函数来调用获取的地址(),但它不工作了,感觉错了,它提出了各种各样的问题:

  1. 我应该修改我tastypie响应包括地址作为一个嵌套的对象?
  2. 如果我更改为一个嵌套的对象,我应该是使用主干关系 ,如问题无法创建骨干,关系相关的模型 ,或者是大材小用?
  3. 我应该重载解析()或fetch()函数或创建我自己的backbone.Sync()获得响应,然后手动做到这一点?
  4. 因为它是一个对一个,我应该不是只是一个模型,而不是一个子模型,并提出一个请求一起发送回信息?

是否有这样做的标准方式吗?

Answer 1:

随着Tastypie,可以响应改变是一个嵌套的对象,而不是一个链接,通过指定完整=真在ForeignKey的定义:

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

这将返回地址物体与人一起。

接下来,我还是不知道这是不是最好的方式 ,但我动了我的分型出的属性和重载解析()来设置它,和update()来保存它,如:

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

在这个例子中,我可以重新添加地址的属性,并设置管理/获取,但随后在自己的环境中,我创建了JSON张贴到服务器备用的toJSON功能,找不到一个很好的方法来设置JSON对象不从集合改变它的JSON响应。



文章来源: How do I load sub-models with a foreign key relationship in Backbone.js?