我正在尝试发布一个基本上由子资源列表组成的资源。这是我的资源:
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/