gpt4 book ai didi

tastypie - 如何在tastypie中制作POST get_or_create相关资源

转载 作者:行者123 更新时间:2023-12-03 14:31:05 24 4
gpt4 key购买 nike

我正在使用 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

和一个空的数据库

当我将此数据发布到我的 Tastypie 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")

但我得到了这样的异常(exception):
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?

最佳答案

我认为我的错误在于试图修改关系字段的目的。如果我的资源实际上包含它们,它们应该可以正常工作。

我应该声明 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com