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

胡安·埃斯特班

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

这就是我试图做的:

模型.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

视图.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)

我想让它尽可能简单地工作,这就是我使用命令“python3 manage.py makemigrations”时得到的:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/base.py", line 332, in execute
    self.check()
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/base.py", line 364, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/management/base.py", line 351, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/stalker/PycharmProjects/ingSoft/servidor/virenv/lib/python3.5/site-packages/django/contrib/auth/checks.py", line 29, in check_user_model
    if not isinstance(cls.REQUIRED_FIELDS, (list, tuple)):
AttributeError: type object 'Usuario' has no attribute 'REQUIRED_FIELDS'

当我尝试其他 stackoverflow 问题的解决方案时,出现此错误:

AttributeError: type object 'Usuario' has no attribute 'USERNAME_FIELD'

如果有使用 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)
优素福BH

在您的情况下,您只是在扩展 DjangoUser模型,因此您不应覆盖AUTH_USER_MODEL.

settings.pyfile: 中删除这行代码AUTH_USER_MODEL = "pedidos.Usuario",如果你想使用你的User模型,在你的代码中,这是你应该使用的:

from django.contrib.auth.models import User

(正如我们所说,您只是在扩展 DjangoUser模型)或者您可以使用方便的功能get_user_model()

get_user_model():

您应该使用 django.contrib.auth.get_user_model() 来引用用户模型,而不是直接引用 User。此方法将返回当前活动的用户模型 - 如果指定了自定义用户模型,否则为 User。

如果要获取 a 的属性es_tecnicoUser可以使用:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='Juan')
>>> juan_es_tecnico = u.usuario.es_tecnico

或使用get_user_model()

>>> 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})

Registrar课堂上使用User模型而不是Usuario.

我希望这将有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 Postman 对 Django REST Framework 进行身份验证

来自分类Dev

在Django Rest Framework视图中测试身份验证-测试时无法进行身份验证

来自分类Dev

Django Rest Framework + Angular.js Web应用程序中的用户身份验证

来自分类Dev

从Django Rest Framework中的令牌获取经过身份验证的用户

来自分类Dev

如何在Django REST Framework中禁用身份验证

来自分类Dev

如何通过 Django Rest Framework 上传图像?

来自分类Dev

Django REST Framework(DRF):将当前用户ID设置为字段值

来自分类Dev

Django Rest Framework中扩展用户模型的补丁方法

来自分类Dev

Django Rest Framework + Ember.js + rest身份验证

来自分类Dev

在DRF(django-rest-framework)中,AttributeError'str'对象没有属性'~~'如何解决?

来自分类Dev

是否在Django Rest Framework(DRF)中过滤代码示例优化问题

来自分类Dev

在Django Rest Framework中使用令牌身份验证进行身份验证时,不会更新last_login字段

来自分类Dev

如何使用AWS Cognito SDK通过使用NodeJS的REST服务对用户进行身份验证?

来自分类Dev

Django REST Framework TokenAuthentication,通常在Django中进行身份验证

来自分类Dev

Django REST Framework TokenAuthentication,通常在Django中进行身份验证

来自分类Dev

使用Django REST Framework作为Django的身份验证后端

来自分类Dev

DRF:如何将django-rest-framework-jwt集成到Djoser

来自分类Dev

Django Rest Framework(DRF)如何根据query_params设置分页类?

来自分类Dev

在Django REST Framework(DRF)中正确使用“可调用默认函数”

来自分类Dev

Django-Rest-Framework,POST操作:字段不为空,但DRF表示必填

来自分类Dev

DRF(django-rest-framework)和TokenAuthentication,如何基于Token自动填充json字段?

来自分类Dev

通过REST端点进行Spring Security身份验证/授权

来自分类Dev

通过REST API身份验证进行TeamCity备份失败

来自分类Dev

通过Wordpress REST API进行身份验证

来自分类Dev

通过REST API身份验证进行TeamCity备份失败

来自分类Dev

向django-rest-framework-simple-jwt添加自定义用户身份验证

来自分类Dev

Django rest框架:如果未通过可浏览的API的身份验证,则进行重定向

来自分类Dev

使用Django REST Framework进行身份验证会返回405

来自分类Dev

使用Django REST Framework进行身份验证会返回405

Related 相关文章

  1. 1

    如何使用 Postman 对 Django REST Framework 进行身份验证

  2. 2

    在Django Rest Framework视图中测试身份验证-测试时无法进行身份验证

  3. 3

    Django Rest Framework + Angular.js Web应用程序中的用户身份验证

  4. 4

    从Django Rest Framework中的令牌获取经过身份验证的用户

  5. 5

    如何在Django REST Framework中禁用身份验证

  6. 6

    如何通过 Django Rest Framework 上传图像?

  7. 7

    Django REST Framework(DRF):将当前用户ID设置为字段值

  8. 8

    Django Rest Framework中扩展用户模型的补丁方法

  9. 9

    Django Rest Framework + Ember.js + rest身份验证

  10. 10

    在DRF(django-rest-framework)中,AttributeError'str'对象没有属性'~~'如何解决?

  11. 11

    是否在Django Rest Framework(DRF)中过滤代码示例优化问题

  12. 12

    在Django Rest Framework中使用令牌身份验证进行身份验证时,不会更新last_login字段

  13. 13

    如何使用AWS Cognito SDK通过使用NodeJS的REST服务对用户进行身份验证?

  14. 14

    Django REST Framework TokenAuthentication,通常在Django中进行身份验证

  15. 15

    Django REST Framework TokenAuthentication,通常在Django中进行身份验证

  16. 16

    使用Django REST Framework作为Django的身份验证后端

  17. 17

    DRF:如何将django-rest-framework-jwt集成到Djoser

  18. 18

    Django Rest Framework(DRF)如何根据query_params设置分页类?

  19. 19

    在Django REST Framework(DRF)中正确使用“可调用默认函数”

  20. 20

    Django-Rest-Framework,POST操作:字段不为空,但DRF表示必填

  21. 21

    DRF(django-rest-framework)和TokenAuthentication,如何基于Token自动填充json字段?

  22. 22

    通过REST端点进行Spring Security身份验证/授权

  23. 23

    通过REST API身份验证进行TeamCity备份失败

  24. 24

    通过Wordpress REST API进行身份验证

  25. 25

    通过REST API身份验证进行TeamCity备份失败

  26. 26

    向django-rest-framework-simple-jwt添加自定义用户身份验证

  27. 27

    Django rest框架:如果未通过可浏览的API的身份验证,则进行重定向

  28. 28

    使用Django REST Framework进行身份验证会返回405

  29. 29

    使用Django REST Framework进行身份验证会返回405

热门标签

归档