我想让django休息框架用户注册工作,我被卡住了。我有一个自定义用户,它向django auth用户添加了一个字段,我正在关注此Java tutorial的第一个答案,但是它给了我一个' KeyError'而且我真的不知道如何解决它。任何帮助表示赞赏!
这是我的模特:
class CustomUser(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
birthday = models.DateField()
这里是Serializer:
class CustomUserSerilizer(serializers.Serializer):
birthday = serializers.DateField()
class Meta:
model = CustomUser
fields = ('birthday')
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
custUser = CustomUserSerilizer(required=False)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'custUser')
def create(self, validated_data):
profile_data = validated_data.pop('custUser')
user = User.objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
Customer.objects.update_or_create(user=user,**profile_data)
return user
观点:
@api_view(['POST'])
def create_auth(request):
serialized = UserSerializer(data=request.data)
if serialized.is_valid():
serialized.save()
return Response(serialized.data, status=status.HTTP_201_CREATED)
else:
return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST)
回溯:
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py" in dispatch
494. response = self.handle_exception(exc)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py" in handle_exception
454. self.raise_uncaught_exception(exc)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py" in dispatch
491. response = handler(request, *args, **kwargs)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\decorators.py" in handler
53. return func(*args, **kwargs)
File "C:\Projects\djangoproject\app\test\views.py" in create_auth
46. serialized.save()
File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py" in save
214. self.instance = self.create(validated_data)
File "C:\Projects\djangoproject\app\test\serializers.py" in create
27. profile_data = validated_data.pop('custUser')
Exception Type: KeyError at /users/register
Exception Value: 'custUser'
答案 0 :(得分:0)
custUser = CustomUserSerilizer(required=False)
因此,用户可能会或可能不会将字段custUser
作为有效负载传递。由于它是required=False
,它只是传递is_valid()
,但在profile_data = validated_data.pop('custUser')
引发KeyError,因为有效负载不包含任何字段custUser
。要避免此错误,请检入def create(self, validated_data)
。像这样的东西
if custUser in validated_data:
profile_data = validated_data.pop('custUser')
但是,从您的模型定义(CustomUser
)birthday
应该是必填字段。但我不知道为什么在Serializer中你保留了birthday
。我希望通过required=False
解决您的问题。