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,但不起作用
保留
对象后,您必须在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()
方法不支持可写嵌套字段。”