Создание связанных записей в одном запросе POST

Используя deliciouspie, как мне создать запись и несколько связанных записей в одном запросе POST?

Например, у меня есть эти два ресурса:

class SongResource(ModelResource):
    playlists = fields.ToManyField('playlists.api.resources.PlaylistResource', 'playlist_set', related_name = "song", full=True)

    class Meta:
        queryset = Song.objects.all();
        resource_name = 'song'
        authorization = Authorization()


class PlaylistResource(ModelResource):
    song = fields.ToOneField(SongResource, 'song', full=True)

    class Meta:
        queryset = Playlist.objects.all()
        resource_name = 'playlist'
        authorization = Authorization()

Я хотел бы создать новый список воспроизведения и его песни одним выстрелом, используя почтовый запрос с данными, что-то вроде этого:

    var data = JSON.stringify({
        'name': 'My playlist.',
        'songs': [{'title': 'Song 1'}, {'title': 'Song 2'}, {'title': 'Song 3'}]
    });

Это не работает. Мне сказали: «Полю« песня »были переданы данные, которые не были URI, не похожи на словарь и не имеют атрибута« pk »». Можно ли так вставить запись одним махом или надо отправлять отдельные запросы на плейлист и на каждую песню?


person Jude Osborn    schedule 11.07.2012    source источник


Ответы (2)


Просто поигравшись с этим очень, очень быстро (и я новичок в deliciouspie, так что отнеситесь к этому с недоверием) - я думаю, вы можете сделать это, переопределив метод obj_create() внутри вашего ресурса. Что-то вроде этого:

class SomeResource(ModelResource):
    class Meta:
        # yadda yadda

    def obj_create(self, bundle, request, **kwargs):
        print "hey we're in object create"
        # do something with bundle.data, this will have your songs in it
        return super(SomeResource, self).obj_create(bundle, request, **kwargs)
person Dan Ancona    schedule 11.07.2012
comment
Я надеялся, что это можно сделать автоматически, но это определенно сработает. Спасибо попробую сегодня. - person Jude Osborn; 12.07.2012

Вы хотите сделать что-то вроде этого:

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"name":"playlist_name", "field2":"value2", "song": ["/api/v1/song/1/"]}' http://localhost:8000/api/v1/playlist/

Удачи!

person Erik    schedule 11.07.2012
comment
Но разве это не предполагает, что песня уже создана? Мне нужно создать плейлист и песню одновременно. - person Jude Osborn; 12.07.2012
comment
В этом случае я делаю это (я думаю): curl --dump-header - -H Content-Type: application/json -X POST --data '{name:playlist_name, field2:value2, song: [title:Song Title, Field2:field2,...]}' localhost:8000/api/v1/playlist - person Erik; 12.07.2012
comment
Это более или менее то, что я делаю в своем примере JSON выше, за исключением того, что мне нужно передать несколько песен, и похоже, что ваш JSON передает только одну песню, верно? - person Jude Osborn; 12.07.2012
comment
К сожалению, я не использовал словарные скобки в своем предыдущем комментарии. Вы можете передать несколько песен следующим образом: curl --dump-header - -H Content-Type: application/json -X POST --data '{name:playlist_name, field2:value2, song: [{title:Song Title 1, Field2:field2},{title:Название песни 2,Field2:field2}]}' localhost:8000/api/v1/playlist - person Erik; 12.07.2012
comment
Да, это то, что я уже делаю, насколько я могу судить, но, похоже, это не работает. См. мой пример JSON выше. Это не то же самое, или я что-то упускаю? - person Jude Osborn; 12.07.2012
comment
Я слышал, что использование full=True вызывает проблемы со связанными записями. Попробуйте отключить их в комментариях к этому ответу здесь: stackoverflow.com/a/11443718/382374 - person Erik; 12.07.2012