2012-07-11 42 views
0

使用tastypie,我將如何在單個POST請求中創建記錄和多個相關記錄?在單個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() 

我想創建一個新的播放列表,並使用與數據POST請求一個炮打響的歌曲,像這樣:

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

這是行不通的。我被告知:「'歌'字段的數據不是URI,也不是字典,並且沒有'pk'屬性」。是否可以像這樣一次插入一條記錄?還是需要爲播放列表和每首歌發送單獨的請求?

回答

1

只是很快就玩弄它(並且我是tastypie的新手,所以帶上一點鹽) - 我想你可以通過重寫資源中的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) 
+0

我希望它可以自動完成,但這絕對可以工作。謝謝,我今天會試一試。 – 2012-07-11 23:53:59

0

你想要做這樣的事情:

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/ 

祝你好運!

+0

但是,這不是假設已經創建了一首歌嗎?我需要同時創建播放列表和歌曲。 – 2012-07-11 23:51:39

+0

我這樣做(我認爲):curl --dump-header - -H「Content-Type:application/json」-X POST --data'{「name」:「playlist_name」,「field2」:「值2「,」歌曲「:[」title「:」歌曲標題「,」Field2「:」field2「,...]}'http:// localhost:8000/api/v1/playlist/ – Erik 2012-07-12 00:07:02

+0

或多或少我在上面的JSON示例中做了什麼,除了我需要傳遞多首歌曲,並且它看起來像您的JSON只傳遞一首歌曲,對嗎? – 2012-07-12 01:17:20

相關問題