Django-tastypie не любит POST с вложенными ресурсами (full = True) - PullRequest
2 голосов
/ 14 февраля 2012

Я использую 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, которые в свою очередь имеют все ServiceSpecRange / константы и т. Д.

Передача всего вложенного ресурса обратно на сервер также отлично работает для существующих данных.

Тем не менее, всякий раз, когда я пытаюсь опубликовать весь вложенный ресурс за один раз (новый сервис с присоединенной новой спецификацией), я получаю:

Аргумент int () должен быть строкой или числом, а не «списком»

У меня уже была эта ошибка, и я обнаружил, что она связана с не включением resource_uri в связанный ресурс. Но в этом случае я пишу - так что не стоит жаловаться на отсутствие resource_uri во вложенном ресурсе. Причина, по которой они не включены, заключается в том, что родительский ресурс еще не был сохранен. Разве вкусный пирог недостаточно продвинут, чтобы это увидеть?

Вот трассировка:

{"error_message": "аргумент int () должен быть строкой или числом, а не 'list' "," traceback ":" Traceback (последний вызов был последним):

Файл \ "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)

Файл \ "build / bdist.linux-x86_64 / egg / tastypie / resources.py \", строка 427, в ответе на отправку = метод (запрос, ** kwargs)

Файл \ "build / bdist.linux-x86_64 / egg / tastypie / resources.py \", строка 1165, в post_list updated_bundle = self.obj_create (связка, 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 bundle.data [field_name] = field_object.hydrate_m2m (комплект)

Файл \ "build / bdist.linux-x86_64 / egg / 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 (запрос, ** lookup_kwargs)

Файл \ "build / bdist.linux-x86_64 / egg / tastypie / resources.py \", строка 1752, в obj_get base_object_list = self.get_object_list (запрос) .filter (** kwargs)

Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / query.py \", строка 550, в фильтре возвращается self._filter_or_exclude (False, * args, ** kwargs)

Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / query.py \", строка 568, в _filter_or_exclude clone.query.add_q (Q (* args, ** kwargs))

Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / SQL / query.py \", строка 1194, в add_q can_reuse = used_aliases, force_having = force_having)

Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / SQL / query.py \", линия 1129, в разъеме add_filter)

* +1048 * Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / SQL / where.py \", строка 67, в add value = obj.prepare (lookup_type, value)

Файл \ "/ USR / местные / Библиотека / python2.7 / сайт-пакеты / Джанго / дб / модели / SQL / where.py \", строка 316, в подготовительном возвращении self.field.get_prep_lookup (lookup_type, значение)

Файл\ "/ usr / local / lib / python2.7 / site-packages / django / db / models / fields / related.py \", строка 136, в get_prep_lookup возвращает self._pk_trace (значение, '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 (значение)

Файл \" / usr / local / lib / python2.7 / site-packages / django / db / models / fields / init .py \ ", строка 479, в get_prep_value возвращает int (значение)

TypeError: аргумент int () должен быть строкой или числом, а не 'list'"}

РЕДАКТИРОВАТЬ :

Я считаю, что эта проблема связана с:

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

Наряду с этим контрольным примером:

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

1 Ответ

1 голос
/ 21 февраля 2012

Это было исправлено в другой ветке.См. запрос на получение .

...