私は 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 を取得するには、うまく機能します。すべての ServiceSpecification を含む Service オブジェクトを返します。これには、すべての ServiceSpecRange や定数などがあります。
ネストされたリソース全体をサーバーに戻すことも、既存のデータに対しては正常に機能します。
ただし、ネストされたリソース全体を一度に投稿しようとすると(新しいサービススペックが添付された新しいサービス)、次のようになります。
int() 引数は、'list' ではなく、文字列または数値でなければなりません
以前にこのエラーが発生したことがあり、resource_uri を関連リソースに含めていないことに関連していることを発見しました。しかし、この場合、私は投稿しているので、ネストされたリソースに resource_uri がないことについて不平を言うべきではありません。それらが含まれていない理由は、親リソースがまだ保存されていないためです。TastyPie はこれを見るには十分に進んでいませんか?
トレースバックは次のとおりです。
{ "error_message":"int() 引数は、'list' ではなく、文字列または数値でなければなりません", "traceback":"Traceback (最新の呼び出しが最後):
ファイル \"build/bdist.linux-x86_64/egg/tastypie/resources.py\"、192 行目、ラッパー応答 = 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 行目、ディスパッチ 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.hydrate_m2m(bundle)
ファイル \"build/bdist.linux-x86_64/egg/tastypie/fields.py\"、742 行目、hydrate_m2m 内 m2m_hydred.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)
ファイル \"/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 行目、add value = obj.prepare(lookup_type, value)
ファイル \"/usr/local/lib/python2.7/site-packages/django/db/models/sql/where.py\"、316 行目、準備中 return 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 で int(value) を返す
TypeError: int() 引数は、'list' ではなく、文字列または数値でなければなりません " }
編集:
この問題は関連していると思います:
https://github.com/toastdriven/django-tastypie/issues/307
このテスト ケースとともに:
https://github.com/joshbohde/django-tastypie/commit/eef8d27fb65d5777a98a3df034af26ceb317deb3