django-tastypie пытается создать связанные объекты по запросу POST

Когда я пытаюсь создать объект с внешним ключом (в данном случае 2) через API моего проекта, deliciouspie также пытается создать связанные объекты (заказ и участник здесь):

class ParticipationResource(ModelResource):
    order = fields.ForeignKey(Order, 'order', full=True,)
    participant = fields.ForeignKey(UserProfile, 'participant', full=True)

    class Meta:
        authorization = Authorization()
        queryset = Participation.objects.all()
        resource_name = 'participation'
        fields = ['id', 'order', 'participant', 'products', 'created_at', 'modified_at']
        filtering = {
            'participant': ALL
        }
        detail_allowed_methods = ['get', 'post', 'put', 'delete',]
        always_return_data = True

Размещены данные:

 {
     "order": {
         "id":"1", 
         "resource_uri":"/api/v1/order/1/"
         ...
      },
     "participant":{
         "id":"1",
         "resource_uri":"/api/v1/participant/1/"
         ...
      },
     "products":[]
  }

Сообщение об ошибке (network_id является внешним ключом в модели профиля пользователя):

"error_message": "app_user_profile.network_id may not be NULL",

Как вы можете видеть, я отправляю полные объекты в своем запросе POST, я пробовал только с resource_uri, и это сработало нормально, проблема в том, что мне нужны полные объекты для рендеринга на стороне клиента (я использую Backbone, а модель рендерится автоматически). Итак, как я могу сделать? Есть ли способ сказать deliciouspie не создавать связанные объекты?


person djevg    schedule 10.02.2012    source источник
comment
Вы спрашиваете, как сделать так, чтобы Tastypie возвращал полные вложенные объекты, но когда вы возвращаете POST обратно, Backbone должен POST только resource_uri, а не полный JSON для вложенных объектов? Используете ли вы Backbone-Tastypie или Backbone-Relational для обработки вложенных объектов на стороне Backbone? Или у вас есть собственная функция parse()?   -  person Edward M Smith    schedule 10.02.2012
comment
Я хочу использовать только полные объекты, чтобы иметь возможность автоматически отображать вложенные объекты на стороне Backbone, но кажется, что Tastypie не может обрабатывать связанные объекты и пытается создавать новые, когда мы не даем resource_uri (хотя resource_uri находится внутри объект). Я использую Backbone-Tastypie и собственную функцию parse().   -  person djevg    schedule 10.02.2012
comment
У вас небольшая опечатка, fields(.)ForeignKey   -  person Mc-    schedule 04.04.2012


Ответы (1)


Когда вы настраиваете TastyPie для full=True, он работает в обоих направлениях — он возвращает полностью вложенные объекты, но также принимает полностью вложенные объекты.

Что вам нужно сделать, так это настроить Backbone так, чтобы он не отправлял полный JSON вложенных объектов, а только resource_uri.

Есть несколько способов сделать это. Один из них — просто использовать Backbone-Relational, который занимается анализом и созданием вложенные модели - поэтому вам не нужно выполнять собственный анализ().

Другой вариант — использовать Backbone-Tastypie (от того же автора), который является подмножеством кода Backbone-Relational, что делает его легче работать с TastyPie.

Но если вы хотите придерживаться того, что у вас есть, вам нужно написать пользовательскую функцию toJSON, которая просто возвращает resource_uri вместо вложенного объекта.

Это сохраняет модели Backbone нетронутыми, но когда они сериализуются для отправки на сервер, используется только ресурс uri:

 {
     "order": "/api/v1/order/1/",
     "participant":"/api/v1/participant/1/",
     "products":[]
  }
person Edward M Smith    schedule 10.02.2012
comment
Спасибо, я попытался извлечь resource_uri на стороне Tastypie, но не подумал об изменении того, как это работает в Backbone. Сначала я попробую Backbone-Relational и попытаюсь написать пользовательскую функцию toJSON, если я не могу получить то, что хочу... - person djevg; 10.02.2012
comment
Я перешел на django-piston по несвязанным причинам, поэтому у меня больше нет этой проблемы, но я принял Backbone-Relational (что действительно полезно), и я думаю, что это помогло бы. Спасибо еще раз. - person djevg; 14.02.2012