django-tastypie попытаться создать связанные объекты по запросу POST - PullRequest
2 голосов
/ 10 февраля 2012

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

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 и модель автоматически отображается). Так как я могу это сделать? Есть ли способ сказать вкусные пироги, чтобы не создавать связанные объекты?

1 Ответ

6 голосов
/ 10 февраля 2012

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

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

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

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

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

Это позволяет сохранить магистральные модели без изменений, но при их сериализации для отправки на сервер используется только ресурс URI:

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