DRF 此字段为必填项

时间:2021-04-24 03:23:08

标签: python reactjs django django-rest-framework

我正在研究 DRF 后端 API 和 React 客户端。每当我将数据发送回服务器时,我都会收到错误 category: this field is required,这是正确的,但我提供了该字段。

我修改了实际的 create() 视图集函数,以便向逻辑添加额外的数据:

class QuestionViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows user to view and edit Question model
    """
    queryset = Question.objects.all().order_by('-updated_at')
    serializer_class = QuestionSerializer
    permission_classes = [permissions.IsAuthenticated]
    filterset_fields = ['created_by', 'created_at', 'updated_at', 'status', 'score']

    def create(self, request, *args, **kwargs):
        serializer = QuestionSerializer(data=request.data, context={'request': request})
        if not serializer.is_valid():
            return Response(serializer.errors, status=400)
        serializer.save(created_by=request.user)
        return Response({
            'question': serializer.data
        })

每当我发送在同一后端控制台中打印的消息时,我都会收到 400 状态响应:<QueryDict: {'question': ['test'], 'category': ['2']}>

序列化器本身:

class QuestionSerializer(serializers.ModelSerializer):
    category = CategorySerializer()
    answers = AnswerSerializer(many=True, source='answer_set', allow_null=True, required=False)
    expert = UserSerializer(required=False)
    moderator = UserSerializer(required=False)
    created_by = UserSerializer(required=False)

        class Meta:
        model = Question
        fields = [
            'id',
            'category',
            'question',
            'status',
            'expert',
            'moderator',
            'created_by',
            'created_at',
            'updated_at',
        ]

我尝试将 category 更改为 category_id,但它也不起作用。我的客户端功能是这样的:

    const query = useQuery();
    const urlSufix = query.get('category') !== null ? `${query.get('category')}/` : '';
    const [{ 
        data: categoryData, 
        loading: loadingCategory, 
        error: categoryError 
    }] = useAxios(CategoryResource.urlRoot + `${urlSufix}`);

async function submitForm(e: React.FormEvent<HTMLFormElement>) {
        e.preventDefault();
        const formData = new FormData(e.target as HTMLFormElement);
        if (!Array.isArray(categoryData)) {
            formData.append('category', categoryData.id);
        }

        const result = await submitQuestion({ data: formData });
        if (result.status == 200) {
            toast.success('question submitted');
        } else if(result.status == 400) {
            toast.error('validation error');
        } else {
            toast.error('server error');
        }
    }

那么,为什么我会收到错误 field is required,尽管它已被发送?

0 个答案:

没有答案