簡體   English   中英

如何使用序列化程序在單個 view.py 中發布兩個模型的數據? django 休息框架

[英]how to post data of two models in single view.py using serializer? django rest framework

假設我創建了 2 個模型,即:預訂和乘客。 兩者都具有多對多的關系。 現在,使用嵌套序列化程序,我如何使用兩個模型的序列化程序在數據庫中發布數據?

模型.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

和相應的序列化程序

序列化程序.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):”

現在我必須使用 POST 方法 def post(self, request, format=None): bookserializer = BookingSerializers(data=request.data) Passengerserializer = PassengerSerializer(data=request.data)

如何在這個單一的 POST 方法中保存來自兩個序列化程序的數據?

視圖.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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM