我有一个小型的Web应用程序,后面有AngularJS前端和Django ReST。当我向Web服务发出POST
请求时,发生了一个奇怪的故障:浏览器控制台清楚地显示了3个正在发送的参数,但后端日志记录仅报告了2个参数。结果是服务器因数据库查找错误而抛出代码500错误。
以下是代码:
var b = newQuesForm.username.value;
$http.post('/myapp/questions/new', {username:b,title:q.title,description:q.description}).
success(function(data, status, headers, config) {
$http.get('/myapp/questions').success(function(data){
$scope.questions = data;
q = null;
$scope.newQuesForm.$setPristine();
}).error(function(data, status, headers, config) {
console.log(headers+data);
});
}).
error(function(data, status, headers, config) {
console.log(headers+data);
});
我的手动日志记录和开发控制台都显示如下字符串:
{"username":"admin","description":"What's your name?","title":"question 1"}
class CreateQuestionSerializer(serializers.Serializer):
author = UserSerializer(required=False)
title = serializers.CharField(max_length=150)
description = serializers.CharField(max_length=350)
def create(self, data):
q= Question()
d = data
q.title = d.get('title')
q.description = d.get("description")
q.author = User.objects.get(username=d.get('username'))
q.save()
return q
服务器端日志记录显示username
参数永远不会成功进行,因此我最终得到代码500和错误消息:
User matching query does not exist.
(没有id = none的用户)
导致某些数据丢失的原因是什么?
答案 0 :(得分:0)
事实证明问题实际上是字段的序列化,正如@nikhiln开始指出的那样。我跟着他的导致重构代码,将create()
方法移动到api.py而不是serializers.py,并停止完全依赖客户端数据来获取用户的身份,这有点愚蠢第一个地方(在视图中将User
传递给隐藏的input
,然后从那里获取用户名并将其传回AJAX参数中的服务器)。这是新代码,完美运行:
class QuestionCreate(generics.CreateAPIView):
model = Question
serializer_class = CreateQuestionSerializer
def create(self, request,*args,**kwargs):
q= Question()
d = request.data
q.title = d.get('title')
q.description = d.get("description")
q.author = request.user
q.save()
if q.pk:
return Response({'id':q.pk,'author':q.author.username}, status=status.HTTP_201_CREATED)
return Response({'error':'record not created'}, status=status.HTTP_400_BAD_REQUEST)
所以在这里,我是以正确的方式做到的:直接从后端的User
param中提取request
。