【发布时间】:2021-08-01 11:52:59
【问题描述】:
我正在尝试从 Model2 的另一个基于类的视图中为 Model1 调用现有的基于类的视图。我从前端收到的 JSON 数据包含 Model1 和 Model 2 的数据,格式如下:
request.data 格式:
{
"model1": {
"key1": "val1"
},
"model2": {
"key2": "val2"
}
}
在我的 Model1View 中,我正在做一些额外的事情,每当我必须将一些新数据保存到 Model1 时,我都想做这些事情。所以我打算使用相同的视图。(这些额外的事情包括创建其他模型实例等)。
目的:在调用Model2View时,我想将Model1的请求数据分离出来,先调用Model1View。一旦我从这个视图中成功获得响应,我想使用 model1_id(Model1 的主键)来添加请求数据并保存 Model2。
问题:使用此视图进行测试时,出现错误:
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
型号:
from django.db import models
class Model1(models.Model):
model1_id = models.AutoField(primary_key=True)
key1 = models.CharField(max_length=20, blank=False, null=False)
class Model2(models.Model):
model2_id = models.AutoField(primary_key=True)
key2 = models.CharField(max_length=20, blank=False, null=False)
model1_id = models.ForeignKey('Model1', blank=False, null=False, on_delete=models.PROTECT)
序列化器:
from rest_framework import serializers
from .models import *
class Model1Serializer(serializers.ModelSerializer):
class Meta:
model = Model1
fields = '__all__'
class Model2Serializer(serializers.ModelSerializer):
class Meta:
model = Model2
fields = '__all__'
观看次数:
from django.shortcuts import render
from rest_framework import generics
from rest_framework.response import Response
from rest_framework import status
from .models import *
from .serializers import *
class Model1View(generics.ListCreateAPIView):
queryset = Model1.objects.all()
serializer_class = Model1Serializer
def post(self, request, *args, **kwargs):
if ('data' in kwargs):
request.data.update(kwargs.get('data'))
# Call super to save the data in Model1
response = super().post(request, *args, **kwargs)
# Do some additional things
return Response(response.data, status.HTTP_201_CREATED)
class Model2View(generics.ListCreateAPIView):
queryset = Model2.objects.all()
serializer_class = Model2Serializer
def post(self, request, *args, **kwargs):
# Get Model1 data and Model2 data from request
model1_data = request.data.pop("model1")
model2_data = request.data.pop("model2")
# Call Model1View to create Model1 Instance
model1_response = Model1View.as_view()(request._request, data=model1_data)
# Save Model1 Instance ID to data and then save Model2 Instance
model2_data["model1_id"] = model1_response['model1_id']
model2_serializer = Model2Serializer(data=model2_data)
if model2_serializer.is_valid():
model2_serializer.save()
return Response(model2_serializer.data, status.HTTP_201_CREATED)
return Response(model2_serializer.errors, status.HTTP_400_BAD_REQUEST)
一些试验:删除request.data.pop 语句可以解决错误,但是,如何从request 中提取数据?如果我在调用 Model1View 之前与 request 对象交互,无论是通过复制它还是更新数据等,我最终都会遇到同样的错误。
【问题讨论】:
标签: django django-rest-framework django-views