0
votes

Suppose I've 2 models created namely: booking and passenger. Both have a relationship of Many-to-many. Now, without using a nested serializer, how do I use both models' serializers to post data inside DB?

model.py


    class Passenger(models.Model):
        name = models.CharField(max_length=100,blank=True, default='')
        contact_number= models.IntegerField()
        email = models.EmailField(max_length=254)
        
        gender = models.IntegerField(choices=GENDER_CHOICES)
        age= models.IntegerField()
        user=models.ForeignKey(User,on_delete=models.CASCADE)
    
        def __str__(self):
            return self.name  
    
    
    class Booking(models.Model):
        user =models.ForeignKey(User,on_delete=models.CASCADE)
        flights =models.ForeignKey(Flight,on_delete=models.CASCADE)
        **passenger =models.ManyToManyField(Passenger)**
        booking_number= models.IntegerField(default=0, blank= True)
        booking_time = models.DateTimeField(auto_now=False, auto_now_add=False)
        no_of_passengers= models.IntegerField(default=0, blank= True)
    
        def __str__(self):
            return self.booking_number

and the Corresponding serializer

serializer.py


    class PassengerSerializer(serializers.ModelSerializer):
        class Meta:
            model= Passenger
            fields = '__all__'
    
    class BookingSerializers(serializers.ModelSerializer):
        class Meta:
            model= Booking
            fields = '__all__'

Now what I've to do is that in views.py I'm creating "class BookingAPIView(APIView):"

NOw in this I've to use POST method def post(self, request, format=None):

bookserializer = BookingSerializers(data=request.data)

passengerserializer = PassengerSerializer(data=request.data)

HOW to save data from both serializers in this single POST method?

view.py


    class BookingAPIView(APIView):
        def get(self, request, format=None):
            bookings = Booking.objects.all()
            serializer = BookingSerializer(bookings, many=True)
            return Response(serializer.data)
    
        def post(self, request, format=None):
            
            bookserializer = BookingSerializers(data=request.data)
            passengerserializer = PassengerSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

1
Why you don't want a nested serializer ?Deepak Tripathi

1 Answers

0
votes

You can raise exception during serializer validation with raise_exception=True. You can then check if both the serializers are valid and then save them one after another. For response, you can combine the data from both the serializers any way you like and then return that. The code will look something like this probably:

def post(self, request, format=None):
    bookserializer = BookingSerializers(data=request.data)
    passengerserializer = PassengerSerializer(data=request.data)
    if bookserializer.is_valid() and passengerserializer.is_valid():
        bookserializer.save(raise_exception=True)
        passengerserializer.save(raise_exception=True)
        data = {
            'book': bookserializer.data,
            'passenger': passengerserializer.data
        }
        return Response(data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)