Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过在DRF(Django Rest框架)中扩展用户模型进行身份验证_Python_Django_Authentication_Django Rest Framework_Token - Fatal编程技术网

Python 通过在DRF(Django Rest框架)中扩展用户模型进行身份验证

Python 通过在DRF(Django Rest框架)中扩展用户模型进行身份验证,python,django,authentication,django-rest-framework,token,Python,Django,Authentication,Django Rest Framework,Token,我已经使用django默认用户类进行了auth.token注册,但我被要求为用户添加一个新字段,我调查了AbtractUser、AbstractBaseUser等情况,我认为最好的解决方案是OneToOneField“方法” 这就是我试图做的: models.py: class Usuario(models.Model): user = models.OneToOneField(User, on_delete = models.CASCADE) es_tecnico = mode

我已经使用django默认用户类进行了auth.token注册,但我被要求为用户添加一个新字段,我调查了AbtractUser、AbstractBaseUser等情况,我认为最好的解决方案是OneToOneField“方法”

这就是我试图做的:

models.py:

class Usuario(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    es_tecnico = models.BooleanField(name = 'es_tecnico', default = False, blank = True)
序列化程序.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username',
                  'password')

class UsuarioSerializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    class Meta:
        model = Usuario
        fields = ('user',
                  'es_tecnico')

    def create(self, validated_data):
        """
        Overriding the default create method of the Model serializer.
        :param validated_data: data containing all the details of student
        :return: returns a successfully created student record
        """
        user_data = validated_data.pop('user')
        user = UserSerializer.create(UserSerializer(), validated_data=user_data)
        usuario, created = Usuario.objects.update_or_create(user=user,
                            es_tecnico=validated_data.pop('es_tecnico'))
        return usuario
views.py:

class UsuarioViewSet(viewsets.ModelViewSet):
    lookup_field = 'id'
    serializer_class = UsuarioSerializer
    queryset = Usuario.objects.all().filter(es_tecnico = False)


class TecnicoViewSet(viewsets.ModelViewSet):
    lookup_field = 'id'
    serializer_class = UsuarioSerializer
    queryset = Usuario.objects.all().filter(es_tecnico = True)
class Registrar(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UsuarioSerializer

    def create(self, request, *args, **kwargs):
        #  Creando un nuevo usuario
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')

        user = Usuario.objects.create_user(username, email, password)
        user.save()

        token = Token.objects.create(user=user)

        return Response({'detail': 'El usuario fue creado con el token: ' + token.key})


class LoginView(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = LoginSerializer

    def create(self, request):
        serializer = LoginSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data["usuario"]
        django_login(request, user)
        token, created = Token.objects.get_or_create(user=user)
        return Response({"token": token.key}, status=200)
我想让它尽可能简单,这就是我在使用命令“python3 manage.py makemigrations”时得到的结果:

如果有一个简单的方法来代替使用OneToOneField,我将非常感激

以下是我目前遇到问题的视图: views.py:

class Registrar(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UsuarioSerializer

    def create(self, request, *args, **kwargs):
        #  Creando un nuevo usuario
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')

        user = Usuario.objects.create_user(username, email, password)
        user.save()

        token = Token.objects.create(user=user)

        return Response({'detail': 'El usuario fue creado con el token: ' + token.key})


class LoginView(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = LoginSerializer

    def create(self, request):
        serializer = LoginSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data["usuario"]
        django_login(request, user)
        token, created = Token.objects.get_or_create(user=user)
        return Response({"token": token.key}, status=200)

在你的例子中,你只是,所以你不应该覆盖
AUTH\u USER\u MODEL

settings.py
文件中删除这行代码:
AUTH\u USER\u MODEL=“pedidos.Usuario”
,如果要在代码中使用
用户
型号,则应使用以下型号:

from django.contrib.auth.models import User
(正如我们所说,您只是在扩展Django
User
model)或者您可以使用方便的功能

获取用户模型():

您不应该直接引用用户,而应该 使用django.contrib.auth.get\u user\u model()引用用户模型。 此方法将返回当前活动的用户模型–自定义 如果指定了用户模型,则为用户模型,否则为用户模型

如果要获取
用户的属性
es_tecnico
,可以使用:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='Juan')
>>> juan_es_tecnico = u.usuario.es_tecnico
或者使用
get\u user\u model()

编辑:

class Registrar(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UsuarioSerializer

    def create(self, request, *args, **kwargs):
        #  Creando un nuevo usuario
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')

        user = User.objects.create_user(username, email, password)
        user.save()

        token = Token.objects.create(user=user)

        return Response({'detail': 'El usuario fue creado con el token: ' + token.key})
registrator
类中,使用
User
模型,而不是
Usuario


我希望这会有所帮助。

settings.py
文件中,您是否正在设置
AUTH\u USER\u MODEL
config var?我已经有一个AUTH\u USER\u MODEL=pedidos.Usuariopedidos.Usuario不是有效的用户模型,因此必须从您的设置中删除“AUTH\u USER\u MODEL=pedidos.Usuario”。看,我有一行coude undeleted,现在当我注册一个用户时,我在API中得到了这个错误:“Manager”对象没有属性“create\u user”。如果你能为有同样问题的人提供一个有用帖子或文档的链接,我会帮助一个lotI understeand,但问题是,我需要使用Django Rest框架,如果我用Django Admin添加一些新的“Usuarios”和我的视图的queryset询问“为我带来所有”Usuarios,其中“es_tecnico=True”,它可以工作,我在这里的问题是,我找不到用DRF@JuanEsteban您的序列化程序
UserSerializer
UsuarioSerializer
看起来不错,有什么问题?同样地,
Usuarios
不是自定义用户,只是扩展用户(称为配置文件模型)。请看,我编辑了这个问题,最后添加了在扩展django用户之前运行良好的视图class@JuanEsteban为清楚起见,您现在遇到的问题或错误是什么?异常类型:AttributeError异常值:“Manager”对象没有属性“create\u user”
>>> from django.contrib.auth import get_user_model
>>> my_user = get_user_model()
>>> u = my_user.objects.get(username='Juan')
>>> juan_es_tecnico = u.usuario.es_tecnico
class Registrar(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UsuarioSerializer

    def create(self, request, *args, **kwargs):
        #  Creando un nuevo usuario
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')

        user = User.objects.create_user(username, email, password)
        user.save()

        token = Token.objects.create(user=user)

        return Response({'detail': 'El usuario fue creado con el token: ' + token.key})