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.
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.
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.
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.
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.
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 } ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With