作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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)
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
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).
product = fields.ToOneField(ProductResource, 'product')
NotFound: An incorrect URL was provided 'Cool Widget' for the 'ProductResource' resource.
最佳答案
我认为我的错误在于试图修改关系字段的目的。如果我的资源实际上包含它们,它们应该可以正常工作。
我应该声明 ReleaseResource.product
作为 CharField
并实现 Release.obj_create
使用 Product.objects.get_or_create
相关Product
创建新对象时 Release
.
class ReleaseResource(ModelResource):
product = CharField(attribute='product__name')
class Meta:
queryset = Release.objects.all()
resource_name = 'release'
def obj_create(self, bundle, **kwargs)
product = Product.objects.get_or_create(name=bundle.data['product'])[0]
super(ModelResource, self).obj_create(bundle, product=product, **kwargs)
ModelResource
上没有填充任何关系字段。自动地,您必须显式声明所有关系字段,而不仅仅是反向字段。
关于tastypie - 如何在tastypie中制作POST get_or_create相关资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666854/
我是一名优秀的程序员,十分优秀!