我正在研究 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
,尽管它已被发送?