python - Tastypie - 嵌套资源被更新而不是在 POST 上创建

标签 python django rest tastypie

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

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

谢谢!

最佳答案

我遇到了同样的问题。

在努力了几个小时之后,我找到了一个强制对相关资源进行 POST 的变通方法:如果您为嵌套资源的主键传递一个 null 值,那么 tastypie 会 POST 一个新的主键,而不是更新现有的。

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

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

关于python - Tastypie - 嵌套资源被更新而不是在 POST 上创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761093/

相关文章:

python每日数据来自每分钟的数据

python - 在后端和前端之间共享工作的最简单方法

django - 如何避免迁移时出现错误 1146?

javax.ws.rs.core.Response 以集合作为实体

python - 在 Mac 上安装 MySQLdb

python - 预期为二维数组,但在尝试反转缩放数据时却得到一维数组

python - 将两个整数列表添加到第三个列表中?

python - 在 django 网页中显示 ip 摄像头实时反馈

android - 带有 Android、iOS 和 WPF 客户端的 WCF Restful 服务

node.js - 引用错误 : require is not defined (on my rest api)