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



如果这有点复杂,很抱歉。。。我还在学习Backbone.js…

加载&是否保存内部具有子模型的主干模型?(我甚至应该有子模型吗?)

例如,(请原谅咖啡脚本),如果我有这样的东西:

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)时,我想保存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响应以将Address作为嵌套对象包括在内吗
  2. 如果我改为嵌套对象,我应该使用主干关系,就像没有创建主干关系相关模型一样,还是这太过分了
  3. 我应该重载parse()或fetch()函数,还是创建自己的主干。同步()以获取响应,然后手动执行此操作
  4. 既然是一对一的,我是否应该只有一个模型,而不是一个子模型,并在一个请求中一起发送信息

有标准的方法吗?

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

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

这将返回地址对象和人员。

接下来,我仍然不知道这是否是最好的方法,但我将我的子模型从属性中移出,并重载parse()来设置它,重载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

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

相关内容

  • 没有找到相关文章

最新更新