4

これが少し複雑な場合は申し訳ありません...私はまだ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('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. Address をネストされたオブジェクトとして含めるように、tastypie 応答を変更する必要がありますか?
  2. ネストされたオブジェクトに変更する場合、Backbone-Relational related models not being createdという質問のように、backbone-relationalを使用する必要がありますか、それともやり過ぎですか?
  3. parse()または fetch() 関数をオーバーロードするか、独自の backbone.Sync() を作成して応答を取得し、これを手動で行う必要がありますか?
  4. 1 対 1 の場合、サブモデルではなく 1 つのモデルだけを使用して、1 つの要求で情報をまとめて送信する必要がありますか?

これを行う標準的な方法はありますか?

4

1 に答える 1

3

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をオブジェクトに設定する良い方法です。

于 2012-07-16T13:28:33.180 に答える