【问题标题】:Django rest custom user model creation failsDjango rest 自定义用户模型创建失败
【发布时间】:2018-06-11 14:19:58
【问题描述】:

我有一个自定义用户模型如下:

class Librarian(models.Model):
    user = models.OneToOneField(User)
    phone = models.CharField(max_length=30, blank=True)
    # A library has many librarians
    which_library = models.ForeignKey('Library', related_name='librarians', on_delete=models.CASCADE)

我已经编写了如下的序列化器:

class LibrarianSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')
    password = serializers.CharField(source='user.password')

    class Meta:
        model = Librarian
        #fields = '__all__'
        fields = ('id', 'username', 'email', 'password', 'phone', 'which_library')

    def update(self, instance, validated_data):
        instance.user.email = validated_data.get('user.email', instance.user.email)
        instance.user.password = validated_data.get('user.password', instance.user.password)
        instance.phone = validated_data.get('phone', instance.phone)
        instance.which_library = validated_data.get('which_library', instance.which_library)
        instance.save()
        return instance

    def create(self, validated_data):
        print('ok')
        return Librarian.objects.create(**validated_data)

它的观点:

@api_view(['POST'])
def librarian(request, library_id):
    """
    Create a new librarian for a specific library
    """

    if request.method == 'POST':
        print('View')
        serializer = LibrarianSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(
                serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

我正在使用以下 JSON 数据向相应的 URL 发出 POST 请求:

{
    "username": "sample",
    "email": "sample@gmail.com",
    "password": "12345678",
    "phone": "12345",
    "which_library": "1"
}

它向我抛出 Cannot assign "{u'username': u'sample', u'password': u'12345678', u'email': u'sample@gmail.com'}": "Librarian.user" must be a "User" instance 错误。

我的目标是创建一个图书管理员(必须自动创建一个用户),这就是我发送用户名、密码和电子邮件字段的原因。我做错了什么?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你需要先重写create方法并创建User实例:

    def create(self, validated_data):
        user_data = validated_data.pop('user')  
        user = User.objects.create(**user_data)
        user.set_password(user_data['password'])
        user.save()  
        return Librarian.objects.create(user=user, **validated_data)
    

    【讨论】:

    • 感谢您的回答!它创建了用户,但是密码按原样保存,没有像其他方式那样散列。
    • @Nitish 哦,是的,你需要使用set_password 方法。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2013-11-15
    • 2019-10-17
    • 2017-08-19
    • 2018-05-21
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多