Django休息框架自定义用户注册

时间:2018-04-16 16:35:05

标签: python django python-3.x serializer

我想让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'

1 个答案:

答案 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')

但是,从您的模型定义(CustomUserbirthday应该是必填字段。但我不知道为什么在Serializer中你保留了birthday。我希望通过required=False解决您的问题。