【发布时间】:2014-09-04 13:31:22
【问题描述】:
我正在使用 Tastypie 为 Django 应用程序创建 REST API,并希望能够在一个 POST 中创建新对象和相关对象。相关对象由用于查找它们的名称指定,如果找不到名称,我想创建新对象。
给定这样的 Django 模型:
class Product(Model):
name = CharField(max_length=32)
class Release(Model):
product = ForeignKey(to=Product, related_name='releases')
version = CharField(max_length=32)
还有这些 Tastypie 资源:
class ProductResource(ModelResource):
class Meta:
queryset = Product.objects.all()
resource_name = 'product'
class ReleaseResource(ModelResource):
class Meta:
queryset = Release.objects.all()
resource_name = 'release'
def hydrate_product(self, bundle):
"""Replace product name with id of existing/created one."""
product = Product.objects.get_or_create(name=bundle.data['product'])
bundle.data['product'] = product.id
return bundle
还有一个空数据库
当我将此数据发布到我的 sweetpie REST API 时:
POST /api/release {
"product": "Cool Widget",
"version": "1.2.3",
}
然后我想创建这些模型对象:
product = Product(name="Cool Widget")
release = Release(product=product, version="1.2.3")
但我得到一个类似这样的异常:
IntegrityError: null value in column "product_id" violates not-null constraint
DETAIL: Failing row contains (1, null, 1.2.3).
并且没有调用 hydrate_product() 方法。
当我将这个类属性添加到 ReleaseResource 时:
product = fields.ToOneField(ProductResource, 'product')
然后我得到这样的东西:
NotFound: An incorrect URL was provided 'Cool Widget' for the 'ProductResource' resource.
如何将捆绑包中的产品名称替换为具有该名称的已创建/现有产品对象的 URI?
【问题讨论】:
标签: tastypie