4

基本的に子リソースのリストで構成されるリソースをPOSTしようとしています。これが私のリソースです:

class MovementResource(ModelResource):
    transactions = fields.ToManyField('stock.api.TransactionResource',
        'transaction_set', related_name='movement', full=True)

    class Meta:
        queryset = Movement.objects.all()
        resource_name = 'movement'
        always_return_data = True
        authorization = Authorization()

class TransactionResource(ModelResource):
    movement = fields.ToOneField(MovementResource, 'movement')
    product = fields.ToOneField(ProductResource, 'product', full=True)

    class Meta:
        queryset = Transaction.objects.all()
        resource_name = 'transaction'
        authorization = Authorization()

これは、在庫内のさまざまな製品の動きを表します。移動フォームは、トランザクションごとに1つずつ、インラインの単なるリストです。djangoフォームはまったく使用していません。

私の問題は、作成するトランザクションのリストを指定するムーブメントをPOSTしようとすると、新しいトランザクションを挿入する代わりに、Tastypieが既存のトランザクションを更新していることに気付くということです。これはPOSTリクエストのJSONであり、1つのトランザクションのみの移動を表します。

{
    'transactions': [
        {
            'product': '/api/v1/product/3/',
            'quantity': '1'
        }
    ]
}

応答JSONは、移動が作成されたことを示していますが、トランザクションには以前から存在し、同じ製品と数量のIDがあります。このトランザクションオブジェクトのムーブメントFKは、新しく作成されたムーブメントを指すように更新されました。応答データ:

{
    'date': '2013-02-07 ···',
    'id': '66',
    'resource_uri': '/api/v1/movement/66/',
    'transactions': [
        {
            'date': '2013-01-30 ···', # Should be the same as parent movement's date
            'id': '30',
            'movement': '/api/v1/movement/66/',
            'product': { ··· product resource data ··· },
            'quantity': '1',
            'resource_uri': '/api/v1/transaction/30/',
        }
    ]
}

私は何かが足りないのですか?Tastypieは、これがリストエンドポイントへのPOSTであるネストされたリソースを作成するべきではありませんか?私は、MovementResourceに対してForeignKeyとToOneFieldの両方を使用して、違いが生じるかどうかを確認しましたが、成功しませんでした。(実際には、2つの違いを見つけることができませんでした。)

ありがとう!

4

1 に答える 1

6

同じ問題が発生しました。

何時間も苦労した後、関連リソースにPOSTを強制する回避策を見つけました。nullネストされたリソースの主キーの値を渡すと、tastypieは既存のリソースを更新するのではなく新しいものをPOSTします。

以下をPOSTすると、探している動作が得られるはずです。

{
   'transactions': [
        {
            'product': '/api/v1/product/3/',
            'quantity': '1',
            'id': null
        }
   ]
}
于 2013-05-27T05:51:43.190 に答える