2

我使用主干美味来创建嵌套资源。

class ServiceResource(ModelResource):
    manager = fields.ToOneField(UserResource, 'manager',full=True)
    area = fields.ToOneField(AreaResource, 'area',full=True)
    specification = fields.ToManyField('services.api.ServiceSpecResource','servicespec_set',full=True)
    class Meta:
        queryset = Service.objects.all()
        resource_name = 'service'

class ServiceSpecResource(ModelResource):
    service = fields.ToOneField(ServiceResource,'service')
    servicespecrange = fields.ToManyField('services.api.ServiceSpecRangeResource','servicespecrange_set',full=True)
    servicespecconstant = fields.ToManyField('services.api.ServiceSpecConstantResource','servicespecconstant_set',full=True)
    servicespecgeneric = fields.ToManyField('services.api.ServiceSpecGenericResource','servicespecgeneric_set',full=True)
    class Meta:
        queryset = ServiceSpec.objects.all()
        resource_name = 'servicespec'
        list_allowed_methods = ['get', 'post']
        detail_allowed_methods = ['get', 'put', 'delete']
        authorization = DjangoAuthorization()

class ServiceSpecRangeResource(ModelResource):  
    servicespec = fields.ToOneField(ServiceSpecResource,'service_spec')
    class Meta:
        queryset = ServiceSpecRange.objects.all()
        resource_name = 'servicespecrange'

class ServiceSpecConstantResource(ModelResource):   
    servicespec = fields.ToOneField(ServiceSpecResource,'service_spec')
    class Meta:
        queryset = ServiceSpecConstant.objects.all()
        resource_name = 'servicespecconstant'

class ServiceSpecGenericResource(ModelResource):
    servicespec = fields.ToOneField(ServiceSpecResource,'service_spec')
    class Meta:
        queryset = ServiceSpecGeneric.objects.all()
        resource_name = 'servicespecgeneric'

为了获得 ServiceResource 它工作得很好。我返回一个包含所有 ServiceSpecification 的 Service 对象,该对象又具有所有 ServiceSpecRange/常量等。

将整个嵌套资源放回服务器也适用于现有数据。

但是,每当我尝试一次性发布整个嵌套资源(附加新服务规范的新服务)时,我都会得到:

int() 参数必须是字符串或数字,而不是“列表”

我之前遇到过这个错误,发现它与不包含相关资源的 resource_uri 有关。但在这种情况下,我正在发布 - 所以它不应该抱怨嵌套资源中缺少 resource_uri。不包含它们的原因是尚未保存父资源。美味派还不够先进,看不到这个吗?

这是回溯:

{ "error_message":"int() 参数必须是字符串或数字,而不是 'list'", "traceback":"Traceback (最近一次调用最后一次):

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 192 行,在包装器 response = callback(request, *args, **kwargs)

F> ile \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 397, in dispatch_list return self.dispatch('list', request, **kwargs)

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 427 行,在 dispatch response = method(request, **kwargs)

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 1165 行,在 post_list updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 1783 行,在 obj_create m2m_bundle = self.hydrate_m2m(bundle)

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 743 行,在 hydrate_m2m bundle.data[field_name] = field_object.hydra_m2m(bundle)

文件 \"build/bdist.linux-x86_64/egg/tastypie/fields.py\",第 742 行,在 hydra_m2m m2m_hydrad.append(self.build_related_resource(value, **kwargs))

文件 \"build/bdist.linux-x86_64/egg/tastypie/fields.py\",第 593 行,在 build_related_resource return self.resource_from_data(self.fk_resource, value, **kwargs)

文件 \"build/bdist.linux-x86_64/egg/tastypie/fields.py\",第 548 行,resource_from_data return fk_resource.obj_update(fk_bundle, **data)

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 1814 行,在 obj_update bundle.obj = self.obj_get(request, **lookup_kwargs)

文件 \"build/bdist.linux-x86_64/egg/tastypie/resources.py\",第 1752 行,在 obj_get base_object_list = self.get_object_list(request).filter(**kwargs)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/query.py\",第 550 行,在过滤器中返回 self._filter_or_exclude(False, *args, **kwargs)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/query.py\",第 568 行,在 _filter_or_exclude clone.query.add_q(Q(*args, **kwargs) )

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py\",第 1194 行,在 add_q can_reuse=used_aliases, force_having=force_having)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py\",第 1129 行,在 add_filter 连接器中)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/where.py\",第 67 行,添加 value = obj.prepare(lookup_type, value)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/where.py\",第 316 行,准备返回 self.field.get_prep_lookup(lookup_type, value)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py\",第 136 行,在 get_prep_lookup 返回 self._pk_trace(value, 'get_prep_lookup', lookup_type)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py\",第 209 行,在 _pk_trace v = getattr(field, prep_func)(lookup_type, v, **kwargs)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/ init .py\",第 292 行,在 get_prep_lookup 返回 self.get_prep_value(value)

文件 \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/ init .py\",第 479 行,在 get_prep_value return int(value)

TypeError: int() 参数必须是字符串或数字,而不是 'list' " }

编辑

我相信这个问题是相关的:

https://github.com/toastdriven/django-tastypie/issues/307

连同这个测试用例:

https://github.com/joshbohde/django-tastypie/commit/eef8d27fb65d5777a98a3df034af26ceb317deb3

4

1 回答 1

1

这已在另一个分支中修复。请参阅拉取请求

于 2012-02-21T14:57:13.813 回答