Django 使用外键在DRF中保存主文件和详细信息

Django 使用外键在DRF中保存主文件和详细信息,django,django-rest-framework,Django,Django Rest Framework,我正在尝试从请求中保存实体 我有两种型号 class Reservation(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) userReservation = models.ForeignKey(User, on_delete=models.CASCADE, default=1) dateStart = models.DateTimeFi

我正在尝试从请求中保存实体

我有两种型号

class Reservation(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    userReservation = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    dateStart = models.DateTimeField(null=False, blank=False, default=datetime.now)  

    def __str__(self):
        return str(self.id)


class DetailsReservation(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    Reservation = models.ForeignKey(Reservation, blank=False, on_delete=models.CASCADE, null=True, related_name='reservation_details')
    product = models.ForeignKey(Product, blank=False, on_delete=models.CASCADE, null=True, related_name='products_reservation')
    Quantity = models.IntegerField(null=False, blank=False, default=0)

    def __str__(self):
        return self.product.product_Description +" by: " + self.userbyReserva.email

    def save(self, *args, **kwargs):
        self.userbyReserva = self.Reservation.userReservation
        super(DetailsReservation, self).save(args, kwargs)
然后我有两个序列化程序

class DetailsReservationSerializer(serializers.ModelSerializer):
    class Meta:
        model = DetailsReservation
        fields = '__all__'


class ReservationSerializer(serializers.ModelSerializer):
    reservation_details = DetailsReservationSerializer(many=True)
    class Meta:
        model = Reservation
        fields = '__all__'
那么在我看来,我有

class makereservation(generics.ListCreateAPIView):

    def post(self, request, *args, **kwargs):
        data = request.data
        data["userReservation"] = request. user.id
        serializer = ReservationSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(status=status.HTTP_201_CREATED)
    return Response(status=status.HTTP_400_BAD_REQUEST)
我正在尝试使用postman(用于模拟请求类型post)

这是我的json

{
    "dateStart": "2020-09-20T13:00:00-05:00",
    "reservation_details": [{
            "product": 1,
            "Quantity": 2
        },
        {
            "productId": 2,
            "Quantity": 2
        }, {
            "productId": 3,
            "Quantity": 1
        }
    ]
}
但我不知道,如何拯救这一切

  • 首先,我尝试保存预订,在获得这些信息后,我尝试使用id插入detailsrervation,但不起作用

Django Rest框架没有内置的创建嵌套对象的支持。但是,他们提供了一些文档,用于在此处添加此功能:

在创建
保留
对象后,您必须在
ReservationSerializer
的创建方法中为
detailsrervation
添加创建功能

下面是一个可能的示例:

class ReservationSerializer(serializers.ModelSerializer):
    reservation_details = DetailsReservationSerializer(many=True)
    class Meta:
        model = Reservation
        fields = '__all__'

    def create(self, validated_data):
        details_data = validated_data.pop('reservation_details') #grab the data on details
        reservation = Reservation.objects.create(**validated_data) # create the master reservation object
        for reservation_detail in details_data:
            # create a details_reservation referencing the master reservation
            DetailsReservation.objects.create(**reservation_detail, reservation=reservation)
        return reservation

还有一个小提示,我建议将
detailsrervation
中的
Reservation
Quantity
重命名为小写,因为它们指的是实例,而不是类。一旦进行了更改,我的代码就可以工作。但是,在
详细信息保留.objects.create
中更改
保留=保留
将使代码在当前状态下与代码一起工作。

Django Rest Framework不具有创建嵌套对象的内置支持。但是,他们提供了一些文档,用于在此处添加此功能:

在创建
保留
对象后,您必须在
ReservationSerializer
的创建方法中为
detailsrervation
添加创建功能

下面是一个可能的示例:

class ReservationSerializer(serializers.ModelSerializer):
    reservation_details = DetailsReservationSerializer(many=True)
    class Meta:
        model = Reservation
        fields = '__all__'

    def create(self, validated_data):
        details_data = validated_data.pop('reservation_details') #grab the data on details
        reservation = Reservation.objects.create(**validated_data) # create the master reservation object
        for reservation_detail in details_data:
            # create a details_reservation referencing the master reservation
            DetailsReservation.objects.create(**reservation_detail, reservation=reservation)
        return reservation

还有一个小提示,我建议将
detailsrervation
中的
Reservation
Quantity
重命名为小写,因为它们指的是实例,而不是类。但是,我的代码在做出更改后仍然有效,更改
detailsrervation.objects中的
reservation=reservation
。create
调用
reservation=reservation
将使代码在当前状态下与代码一起工作。

您试图使用嵌套数据和单个请求创建
reservation
和许多
detailsrervation
对象,对的另外,当你说它不“工作”时,它在做什么(如果有错误消息,消息是什么)?是的,Mr,一个保留和许多详细信息\u保留一个请求,但在发送请求时,它向我显示此错误“默认情况下,
.create()
方法不支持可写嵌套字段。”您正试图使用嵌套数据和单个请求创建一个
保留
和许多
详细信息保留
对象,对吗?另外,当你说它不“工作”时,它在做什么(如果有错误消息,消息是什么)?是的,Mr,一个保留和许多详细信息\u保留一个请求,但在发送请求时,它向我显示此错误“默认情况下,
.create()
方法不支持可写嵌套字段。”