Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating multiple objects with one request in Django and Django Rest Framework

I am using Django as the backend server and Vue.js for the front end Movie app.

I have a Ticket model

class MovieTicket(models.Model):     show = models.ForeignKey(Show)     seat = models.ForeignKey(Seat)     user = models.ForeignKey(User)     purchased_at = models.DateTimeField(default=timezone.now)     qrcode = models.ImageField(upload_to='qrcode', blank=True, null=True)     qrcode_data = models.CharField(max_length=255, unique=True, blank=True)      class Meta:         unique_together = ('show', 'seat') 

And its related Serializer

class MovieTicketSerializer(serializers.ModelSerializer):     class Meta:         model = MovieTicket         fields = '__all__' 

To buy a new Ticket there's a view which is mapped to this url http://dev.site.com/api/movies/buy-ticket/:

@api_view(['POST']) @permission_classes([IsAuthenticated]) def buy_ticket(request):     serialized = MovieTicketSerializer(data=request.data)     if serialized.is_valid():         serialized.save()         return Response(serialized.data, status=status.HTTP_201_CREATED)     return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST) 

Now from the front end (Vue.js) I can create a new movie ticket:

const formBody = {     show: this.$store.state.showSelected.showTime.id,     user: this.$store.state.user.id,      // selectedSeats is an array of seats that have been selected by the user. Here I am passing the first seat object.     seat: this.$store.state.selectedSeats[0].seat.id };  this.$http.post("http://dev.site.com/api/movies/buy-ticket/", formBody)     .then(function (response) {         console.log(response.data);     })     .catch(function (response) {         console.log(response);     }); return; 

If the form was valid, this will create a new MovieTicket Object, or else show the error/s.

Now, suppose if the user selected multiple seats, I can loop through each selectedSeats array and get the seat ids on the client side. And post something like this:

{     "purchased_at": null,     "qrcode": null,     "qrcode_data": "",     "show": 11,     "seat": [         106,         219     ],     "user": 34 } 

But what I am confused is how can I pass multiple seat.id if Django rest framework is only accepting one seat per request and display errors accordingly? Meaning display errors if a ticket is available or not, and if its available create movie tickets for that show-seat.

like image 333
Aamu Avatar asked Apr 16 '17 08:04

Aamu


People also ask

How do I create multiple model instances with Django REST framework?

To create multiple model instances with the Python Django Rest Framework, we can create a serialize with many set to True . to call the super class' __init__ method with the many argument set to many . If it's True , then our serializer can accept multiple model instances.

What is the difference between ModelSerializer and HyperlinkedModelSerializer?

The HyperlinkedModelSerializer class is similar to the ModelSerializer class except that it uses hyperlinks to represent relationships, rather than primary keys. By default the serializer will include a url field instead of a primary key field.

What is Mixins in Django REST framework?

Mixins are a design pattern found in many languages. In Python, though the language does not support mixins natively,they are implemented using Python's multiple inheritence model. The mixins are different from inheritence. Inheritence is useful when you want to narrow a scope in the inherited class.

What is Restapi in Django?

REST APIs are an industry-standard way for web services to send and receive data. They use HTTP request methods to facilitate the request-response cycle and typically transfer data using JSON, and more rarely - HTML, XML and other formats.


1 Answers

Init the serializer with many=True

In your implementation this is really easy to accomplish:

serialized = MovieTicketSerializer(data=request.data, many=True) 

Data is no single object but an array of objects.

Your infos suggest that you need to transform request.data to make those multiple objects (all the same data just different seat number). Right?

anyways:

see: How do I create multiple model instances with Django Rest Framework?

EDIT:

here the info in the drf docu: http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-multiple-objects

(highly suggest to read the drf docs from top to bottom and just playing around with it, before coding your first real implementation. there are many ways to use drf, and knowing all of them leads to better decisions)

EDIT 2 (after question update):

You could send this JSON from the client (see below), or create this format from the current JSON the client sends in your buy_ticket(request) method before you call MovieTicketSerializer(...,many=True):

[     {         "purchased_at": null,         "qrcode": null,         "qrcode_data": "",         "show": 11,         "seat": 106,         "user": 34     },     {         "purchased_at": null,         "qrcode": null,         "qrcode_data": "",         "show": 11,         "seat": 219,         "user": 34     } ] 
like image 110
fetzig Avatar answered Sep 21 '22 18:09

fetzig