2012-02-14 52 views
2

Im使用backbone-tastypie創建嵌套資源。Django-tastypie不喜歡使用嵌套資源的POST(full = True)

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的這反過來又擁有所有ServiceSpecRange的/常數等。

把整個嵌套的資源返回給服務器也能正常工作的現有數據。

但是,每當我嘗試後一氣呵成的整體嵌套的資源(新服附有新servicespec)我得到:

int()函數的參數必須是字符串或數字,而不是「名單」

我以前有過這個錯誤,並且發現它與沒有在相關資源中包含resource_uri有關。但在這種情況下,我發佈 - 所以它不應該抱怨在嵌套資源中缺少resource_uri。他們沒有被包括的原因是因爲父資源還沒有被保存。 tastypie不夠先進,看不到?

這裏是回溯:

{ "error_message":"int() argument must be a string or a number, not 'list'", "traceback":"Traceback (most recent call last):

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 192, in wrapper 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)

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 427, in dispatch response = method(request, **kwargs)

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 1165, in post_list updated_bundle = self.obj_create(bundle, request=request, **self.remove_api_resource_names(kwargs))

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 1783, in obj_create m2m_bundle = self.hydrate_m2m(bundle)

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 743, in hydrate_m2m bundle.data[field_name] = field_object.hydrate_m2m(bundle)

File \"build/bdist.linux-x86_64/egg/tastypie/fields.py\", line 742, in hydrate_m2m m2m_hydrated.append(self.build_related_resource(value, **kwargs))

File \"build/bdist.linux-x86_64/egg/tastypie/fields.py\", line 593, in build_related_resource return self.resource_from_data(self.fk_resource, value, **kwargs)

File \"build/bdist.linux-x86_64/egg/tastypie/fields.py\", line 548, in resource_from_data return fk_resource.obj_update(fk_bundle, **data)

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 1814, in obj_update bundle.obj = self.obj_get(request, **lookup_kwargs)

File \"build/bdist.linux-x86_64/egg/tastypie/resources.py\", line 1752, in 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\", line 550, in filter return self._filter_or_exclude(False, *args, **kwargs)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/query.py\", line 568, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs))

File \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py\", line 1194, in add_q can_reuse=used_aliases, force_having=force_having)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py\", line 1129, in add_filter connector)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/where.py\", line 67, in add value = obj.prepare(lookup_type, value)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/where.py\", line 316, in prepare return self.field.get_prep_lookup(lookup_type, value)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py\", line 136, in get_prep_lookup return self._pk_trace(value, 'get_prep_lookup', lookup_type)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py\", line 209, in _pk_trace v = getattr(field, prep_func)(lookup_type, v, **kwargs)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/init.py\", line 292, in get_prep_lookup return self.get_prep_value(value)

File \"/usr/local/lib/python2.7/site-packages/django/db/models/fields/init.py\", line 479, in get_prep_value return int(value)

TypeError: int() argument must be a string or a number, not 'list' " }

編輯

我相信這個問題是相關的:

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

隨着這個測試用例:

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

+0

你可以發佈完整的追溯? – 2012-02-14 13:28:19

+0

我已經添加了回溯到我的問題:) – 2012-02-14 15:34:24

+0

還在github上添加了一個問題和測試用例,這似乎與某種方式有關。 – 2012-02-14 16:01:07

回答

1

這已在另一個分支中修復。請參閱pull request