首页 文章

Django-tastypie不喜欢使用嵌套资源的POST(full = True)

提问于
浏览
2

我使用backbone-tastypie来创建嵌套资源 .

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,它工作得很好 . 我返回一个Service对象,其中包含所有ServiceSpecification,而ServiceSpecification又包含所有ServiceSpecRange / constants等 .

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

但是,每当我尝试一次发布一个完整的嵌套资源(附加了新的servicespec的新服务)时,我得到:

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

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

这是追溯:

{“error_message”:“int()参数必须是字符串或数字,而不是'list'”,“traceback”:“Traceback(最近一次调用最后一次):File \”build / bdist.linux-x86_64 / egg /tastypie/resources.py \“,第192行,包装器响应=回调(请求,* args,** kwargs)F> ile \”build / bdist.linux-x86_64 / egg / tastypie / resources.py \“,第397行,在dispatch_list中返回self.dispatch('list',request,** kwargs)File \“build / bdist.linux-x86_64 / egg / tastypie / resources.py \”,第427行,在dispatch response = method中(请求,** 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(包)文件\“build / bdist.linux-x86_64 / egg / tastypie / resources.py \“,第743行,在hydrate_m2m中.socket.data [field_name] = field_object.hydrate_m2m(包)文件\”build / bdist.linux-x86_64 / e gg / tastypie / fields.py \“,第742行,在hydrate_m2m中m2m_hydrated.append(self.build_related_resource(value,** kwargs))文件\”build / bdist.linux-x86_64 / egg / tastypie / fields.py \“ ,第593行,在build_related_resource中返回self.resource_from_data(self.fk_resource,value,** kwargs)文件\“build / bdist.linux-x86_64 / egg / tastypie / fields.py \”,第548行,在resource_from_data中返回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)File \“/ usr / local / lib / python2 .7 / site-packages / django / db / models / query.py \“,第550行,在过滤器中返回self._filter_or_exclude(False,* args,** kwargs)File \”/ usr / local / lib / python2 . 7 / site-packages / django / db / models / query.py \“,第568行,在_filter_or_exclude中克隆.query.add_q(Q(* args,** kwargs))Fil e \“/ 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行,in add value = obj.prepare(lookup_type,value)File \”/ 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(字段,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)File \“/ usr / local / lib / python2.7 / site-packages / django / db / models / fields / init.py \”,第479行,在get_prep_value中返回int(value)TypeError :int()参数必须是字符串或数字,而不是'list'“}

EDIT

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

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

与此测试用例一起:

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

1 回答

  • 1

    这已在另一个分支中修复 . 见pull request .

相关问题