Аутентификация токена Django Rest Framework для пользовательской модели пользователя

Я новичок в использовании 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)

Я следовал руководству здесь

Как сделать так, чтобы при регистрации игрок получал токен, который будет использоваться для аутентификации?


person dot64dot    schedule 31.01.2018    source источник
comment
Я считаю, что Token.user на самом деле должен быть экземпляром User. Не экземпляр Member. Возможно, у вашего Member есть связанный User, на который вы могли бы ссылаться, чтобы получить связанный Token.   -  person Ross Rogers    schedule 31.01.2018
comment
К сожалению, mods.User никак не связан с players.Member, кроме того факта, что mods.User имеет права администратора. Есть ли другой вариант, кроме использования Token.objects.create?   -  person dot64dot    schedule 31.01.2018
comment
Дело в том, что ты ломаешь шаблон. Поведение по умолчанию для аутентификации в django использует таблицу User, и она автоматически привязывается к связке промежуточного программного обеспечения django. Стандартная http Auth, Token Auth, сеансы. Почему бы вам не использовать стандартную таблицу/модель User? Users не должны иметь права администратора/суперпользователя. В любом случае, я понимаю, что вы работаете с дизайнерскими решениями других людей, но использование нестандартной таблицы для идентификации потребует изменения или настройки множества разных частей. Возможно, у каждого Member может быть экземпляр User.   -  person Ross Rogers    schedule 31.01.2018


Ответы (1)


У меня была такая же проблема, и я решил ее, используя:

user=user.get()
person kimanihuon    schedule 01.06.2021