django:如何在不填充所有序列化程序参数的情况下将条件传递给 .is_valid()
django: how to pass condition to .is_valid() without populating all serializers parameters
从前端,有必要获取问题对象以了解在前端的 get 函数中 return 的内容,请求被发送到 post 函数 随着要 returned
的对象的 id
和 class TestQuestionList
在 post 函数中我不需要创建一个新对象,所以我不填写请求中的字段、图像、答案,但是 django 要求我填写这些字段并且 returns - 错误请求 400
"POST /api/questions/ HTTP/1.1" 400 85
views.py
class TestQuestionList(APIView):
def __init__(self):
self.questions = [1]
def get(self, request):
romms = TestQuestionBlok.objects.filter(id__in=self.questions)
serializer = TestQuestionSerializers(romms, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer1 = TestQuestionSerializers(data=request.data)
if serializer1.is_valid() :
self.questions = serializer1.data['questions']
return Response(serializer1.data, status=status.HTTP_200_OK)
return Response(serializer1.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class TestQuestionSerializers(serializers.ModelSerializer):
class Meta:
model = TestQuestionBlok
fields = ('__all__')
models.py
class TestQuestionBlok(models.Model):
image = models.ImageField(upload_to='questionsImages/')
answers = models.ManyToManyField(TestAnswers)
question = models.CharField(max_length=300)
def __str__(self):
return self.question
如何绕过这些要求?
您的 API 应该看起来像这样才能获得多个对象:
class YourAPI(APIView):
class InputSerializer(serializers.Serializer):
...
objects = serializers.PrimaryKeyRelatedField(
queryset=YourResourceModel.objects.all(),
required=False,
allow_empty=True,
allow_null=True
)
...
class OutputSerializer(serializers.ModelSerializer):
class Meta:
model = TestQuestionBlok
fields = ('__all__')
def post(self, request):
serialzier = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(serializer.validated_data)
序列化程序不必是您的 API 的一部分,这只是一个示例。但是,根据一些风格指南,这是一个很好的做法。
本质上,你的 FE 将你需要的对象的 PK 作为数组传递给 BE,在一个名为 objects
的变量中,你可以随意调用它。
从前端,有必要获取问题对象以了解在前端的 get 函数中 return 的内容,请求被发送到 post 函数 随着要 returned
的对象的 id和 class TestQuestionList
在 post 函数中我不需要创建一个新对象,所以我不填写请求中的字段、图像、答案,但是 django 要求我填写这些字段并且 returns - 错误请求 400
"POST /api/questions/ HTTP/1.1" 400 85
views.py
class TestQuestionList(APIView):
def __init__(self):
self.questions = [1]
def get(self, request):
romms = TestQuestionBlok.objects.filter(id__in=self.questions)
serializer = TestQuestionSerializers(romms, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer1 = TestQuestionSerializers(data=request.data)
if serializer1.is_valid() :
self.questions = serializer1.data['questions']
return Response(serializer1.data, status=status.HTTP_200_OK)
return Response(serializer1.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class TestQuestionSerializers(serializers.ModelSerializer):
class Meta:
model = TestQuestionBlok
fields = ('__all__')
models.py
class TestQuestionBlok(models.Model):
image = models.ImageField(upload_to='questionsImages/')
answers = models.ManyToManyField(TestAnswers)
question = models.CharField(max_length=300)
def __str__(self):
return self.question
如何绕过这些要求?
您的 API 应该看起来像这样才能获得多个对象:
class YourAPI(APIView):
class InputSerializer(serializers.Serializer):
...
objects = serializers.PrimaryKeyRelatedField(
queryset=YourResourceModel.objects.all(),
required=False,
allow_empty=True,
allow_null=True
)
...
class OutputSerializer(serializers.ModelSerializer):
class Meta:
model = TestQuestionBlok
fields = ('__all__')
def post(self, request):
serialzier = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(serializer.validated_data)
序列化程序不必是您的 API 的一部分,这只是一个示例。但是,根据一些风格指南,这是一个很好的做法。
本质上,你的 FE 将你需要的对象的 PK 作为数组传递给 BE,在一个名为 objects
的变量中,你可以随意调用它。