【问题标题】:Tastypie - Nested resources are updated instead of created on POSTTastypie - 更新嵌套资源而不是在 POST 上创建
【发布时间】:2013-02-07 21:14:02
【问题描述】:

我正在尝试发布一个基本上由子资源列表组成的资源。这是我的资源:

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()

这表示库存中各种产品的移动。移动表单只是一个内联列表,每个事务都有一个。它根本不使用 django 表单。

我的问题是,当尝试发布指定要创建的交易列表的动作时,我发现 Tastypie 不是插入新交易而是更新现有交易。这是 POST 请求的 JSON,表示只有一个事务的移动:

{
    '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 到列表端点吗?我已经尝试使用 ForeignKey 和 ToOneField 到 MovementResource,看看它是否会有所作为,但没有成功。 (其实我找不到两者的区别。)

谢谢!

【问题讨论】:

    标签: python django rest tastypie


    【解决方案1】:

    我遇到了同样的问题。

    在挣扎了几个小时后,我发现了一种强制在相关资源上发布 POST 的解决方法:如果您为嵌套资源的主键传递 null 值,那么美味派会发布一个新的,而不是更新现有的。

    如果您发布以下内容,您应该得到您正在寻找的行为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多