Как разместить данные двух моделей в одном view.py с помощью сериализатора? django rest framework

Предположим, что у меня создано 2 модели, а именно: бронирование и пассажир. Обе имеют отношения типа "многие-ко-многим". Теперь, не используя вложенный сериализатор, как я могу использовать сериализаторы обеих моделей для отправки данных в 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

и соответствующий сериализатор

serializer.py


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

Теперь мне нужно сделать следующее: в файле views.py я создаю "class BookingAPIView(APIView):"

NOw в этом я должен использовать метод POST def post(self, request, format=None):

bookserializer = BookingSerializers(data=request.data)

passengerserializer = PassengerSerializer(data=request.data)

КАК сохранить данные из обоих сериализаторов в одном методе POST?

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)

Вы можете вызвать исключение во время проверки сериализатора с помощью raise_exception=True. Затем вы можете проверить, действительны ли оба сериализатора, и затем сохранить их один за другим. Для ответа вы можете объединить данные из обоих сериализаторов любым удобным для вас способом и затем вернуть их. Код будет выглядеть примерно так:

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)
Вернуться на верх