2

プロジェクト API を介して外部キー (この場合は 2) を持つオブジェクトを作成しようとすると、tastypie は関連するオブジェクトも作成しようとします (注文と参加者はこちら):

class ParticipationResource(ModelResource):
    order = fields.ForeignKey(Order, 'order', full=True,)
    participant = fields.ForeignKey(UserProfile, 'participant', full=True)

    class Meta:
        authorization = Authorization()
        queryset = Participation.objects.all()
        resource_name = 'participation'
        fields = ['id', 'order', 'participant', 'products', 'created_at', 'modified_at']
        filtering = {
            'participant': ALL
        }
        detail_allowed_methods = ['get', 'post', 'put', 'delete',]
        always_return_data = True

掲載データ:

 {
     "order": {
         "id":"1", 
         "resource_uri":"/api/v1/order/1/"
         ...
      },
     "participant":{
         "id":"1",
         "resource_uri":"/api/v1/participant/1/"
         ...
      },
     "products":[]
  }

エラー メッセージ (network_id はユーザー プロファイル モデルの外部キーです):

"error_message": "app_user_profile.network_id may not be NULL",

ご覧のとおり、私は POST リクエストで完全なオブジェクトを送信しています。resource_uri だけで試してみましたが、問題なく動作しました。問題は、クライアント側のレンダリングに完全なオブジェクトが必要なことです (私はバックボーンを使用しており、モデルは自動的にレンダリングされます)。では、どうすればよいですか?関連オブジェクトを作成しないようにtastypieに指示する方法はありますか?

4

1 に答える 1

6

TastyPie を full=True に構成すると、両方の方法で機能します。完全にネストされたオブジェクトが返されますが、完全にネストされたオブジェクトも受け入れられます。

必要なことは、ネストされたオブジェクトの完全な JSON を送信するのではなく、resource_uri のみを送信するように Backbone を構成することです。

これを行うにはいくつかの方法があります。1 つの方法は、ネストされたモデルの解析と作成を処理するBackbone-Relationalを使用することです。そのため、カスタム parse() を実行する必要はありません。

もう 1 つは、TastyPie での作業を容易にする Backbone-Relational コードのサブセットであるBackbone-Tastypie (同じ作成者による) を使用することです。

ただし、既存のものに固執する場合は、ネストされたオブジェクトの代わりに単に resource_uri を返すカスタム toJSON 関数を作成する必要があります。

これにより、バックボーン モデルはそのまま保持されますが、シリアル化されてサーバーに送信されるときは、リソース uri のみが使用されます。

 {
     "order": "/api/v1/order/1/",
     "participant":"/api/v1/participant/1/",
     "products":[]
  }
于 2012-02-10T16:32:18.100 に答える