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 を取得するには、うまく機能します。すべての 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

4

1 に答える 1

1

これは別のブランチで修正されました。プルリクエストを参照してください。

于 2012-02-21T14:57:13.813 に答える