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 的一部分,这只是一个示例。但是,根据一些风格指南,这是一个很好的做法。

查看 PrimaryKeyRelatedField

本质上,你的 FE 将你需要的对象的 PK 作为数组传递给 BE,在一个名为 objects 的变量中,你可以随意调用它。