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

标签 jquery python backbone.js tastypie backbone-relational

对不起,如果这有点令人费解......我还在学习 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() 并让它同时获得这个家伙和他的地址,当我调用 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 吗? , 如问题 Backbone-Relational related models not being created ,或者这是矫枉过正?
  3. 我应该overloading the 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 响应。

关于jquery - 如何在 Backbone.js 中加载具有外键关系的子模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502614/

相关文章:

jquery - 如何向 jquery-ui datepicker 实例添加额外的事件处理程序?

javascript - 如何使用 jQuery 添加第 n 个项目类

javascript - 是否有用于 backbone.js 等的用于 javascript 的现代/轻量级布局库?

javascript - Backbone Collections - 无法使用 set 方法设置 'rank'

javascript - 如何在 Backbone 事件对象中使用变量?

JQuery:绑定(bind)点击hrefs

jquery - 如果选择选项不是 :disabled then removeClass

python - 从多个 pyodbc 数据库查询结果构造一个大的 json 响应

python - 脚本适用于 IDLE 但不适用于 PowerShell

python - Pandas 未从 xlsx 文件中读取第一列