Как разместить данные двух моделей в одном 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)