Search code examples
pythondjangotastypierestful-url

POST multiple objects in one TastyPie API request


I'd like to create multiple related objects in a single post request if it's possible. I have a app that has multiple games, and I want to post to the database the app activities for each game.

Each activity object in the model has a game object as a foreign key, so I need to create the game, before I can create the activity objects.

{
     "game": {
         "name":"monte",
         "app":"/api/v1/app/1/"
      },

     "activity":{
         "type":"eggs",
         "score":"0.90",
         "game":"_INSERT_MONTE_RESOURCE_URI_HERE_"
      },

     "activity":{
         "type":"spam",
         "score":"1.00",
         "game":"_INSERT_MONTE_RESOURCE_URI_HERE_"
      }
}

Is there a simple way to do this, or do I need to make 3 post requests from my app? One to create the game, and then one for each of the activities?

I thought maybe a PATCH would work, but then I realized that I wouldn't know the game resource URI to assign to each of the activities when I sent my patch request. I suppose I could create the game in one request, and then the activities in a patch request, I'm simply hoping that it's possible to do it all in one batch.


Solution

  • If the game resource look like:

    class GameResource(ModelResource):
        activities = fields.ToManyField(ActivityResource, 'activities', full=True)
    

    Following the note in tastypie documentation:

    Tastypie encourages “round-trippable” data, which means the data you can GET should be able to be POST/PUT’d back to recreate the same object. If you’re ever in question about what you should send, do a GET on another object & see what Tastypie thinks it should look like.

    You will be able to create all in one batch.