为自定义用户模型实现Django Rest Framework令牌认证

3
我刚开始使用 Django Rest Framework,接手了一个 Django 项目,有两个用户模型:mods.User(绑定了AUTH_USER_MODEL)和 players.Member。由于某些原因,它们都继承了AbstractBaseUser,但涉及不同的信息,只有一个email字段是共通的。
我想为players.Member中的用户使用令牌认证,并创建了一个端点/players_endpoint/register,成功将玩家添加到数据库。然而,添加数据后,JSON 响应会显示:Cannot assign "<Member: offworld_321>": "Token.user" must be a "User" instance. 我的创建视图代码如下:
class MemberCreateView(generics.CreateAPIView):
    queryset = Member.objects.all()

    def post(self, request, format='json'):
        serializer = MemberCreateSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            if user:
                token = Token.objects.create(user=user)
                json = serializer.data
                json['token'] = token.key
                return Response(json, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我在这里跟随教程(链接)

如何让用户注册后接收到一个令牌,用于身份验证?


我认为 Token.user 实际上必须是一个 User 实例,而不是一个 Member 实例。也许你的 Member 有一个关联的 User,你可以引用它来检索相关的 Token - Ross Rogers
不幸的是,mods.Userplayers.Member 的关联方式除了 mods.User 具有管理员特权之外,没有其他选项。除了使用 Token.objects.create,还有其他选择吗? - dot64dot
1
问题在于你正在打破常规。Django中身份验证的默认行为是使用“User”表,它将自动绑定到一堆Django中间件。标准的http Auth、Token Auth、sessions。为什么不想使用标准的“User”表/模型呢?用户不必拥有管理员/超级用户权限。无论如何,我知道你正在处理其他人的设计决策,但是使用非标准的身份表将需要修改或配置许多不同的部分。也许每个“Member”都可以有一个“User”实例。 - Ross Rogers
1个回答

0

我曾遇到同样的问题,并使用以下方法解决:

user=user.get()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接