Django Rest Framework Extra kwargs fields for Password and Unique Email

Traté de crear serializadores para mi Modelo y probé el Modelo de serialización Quiero que el campo de contraseña se escriba **** formato cuando trato de entrar contraseña y correo electrónico para ser único en los campos de kwargs extra ¿cómo puedo hacer eso? Aquí están mis serializadores que intenté.

   User = get_user_model()
    
    
    class AddBusCompanyUserSerializer(serializers.ModelSerializer):
        position = serializers.PrimaryKeyRelatedField(queryset=StaffPosition.objects.all())
    
        class Meta:
            model = User
            fields = (
                'phone_number',
                'password',
                'position',
                'email',
            )
            extra_kwargs = {'password': {'write_only': True},'email':?}
}

¿Qué validador debo tratar de hacer que el email sea único y el campo de contraseña se escribe en formato ****?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por algoarchitect


3 Respuestas:

  • Por fin trabajo por mi cuenta

     extra_kwargs = {
            'password': {
                'write_only': True,
                'style': {'input_type': 'password'}
            },
            'email': {
                'validators': [
                    UniqueValidator(
                        queryset=User.objects.all()
                    )
                ]
            }
        }
        'style': {'input_type': 'password'}
    

    permite que la contraseña esté en formato **** en serializadores y

    'validators': [
                    UniqueValidator(
                        queryset=User.objects.all()
                    )
                ]
    

    permite que el correo electrónico sea único

    Respondida el Dec 17, 2020 a las 14:10 - por daniel1

    Votos positivos: 0 | Votos negativos: 0

  • Para hacer que el campo de contraseña se escriba en formato <strong>None</strong> al ser introducido y que el campo de correo electrónico sea único, puedes hacer lo siguiente en tu serializador:

    python
    User = get_user_model()
    
    class AddBusCompanyUserSerializer(serializers.ModelSerializer):
        position = serializers.PrimaryKeyRelatedField(queryset=StaffPosition.objects.all())
        password = serializers.CharField(write_only=True, style={'input_type': 'password'})  

    Para ocultar la contraseña al escribirla

    class Meta: model = User fields = ( 'phone_number', 'password', 'position', 'email', ) extra_kwargs = { 'email': {'validators': [UniqueValidator(queryset=User.objects.all())]}

    Validador para campo email único

    }

    En este caso:

    • `style={'input_type': 'password'}` en el campo de la contraseña hace que se muestre como `None` al escribirla.
    • `` en el campo de email añade un validador que verificará que el email sea único en la base de datos.

    Al añadir estos cambios a tu serializador, el campo de contraseña se mostrará de forma oculta al escribir y el campo de email será validado para ser único en la base de datos.

    Respondida el Dec 18, 2020 a las 14:12 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Serializador para escribir contraseña como </strong><strong>:

    Para escribir el campo de contraseña como <strong>None</strong> en el serializador, puedes usar el atributo style en extra_kwargs.

    python
    class AddBusCompanyUserSerializer(serializers.ModelSerializer):
        position = serializers.PrimaryKeyRelatedField(queryset=StaffPosition.objects.all())
    
        class Meta:
            model = User
            fields = (
                'phone_number',
                'password',
                'position',
                'email',
            )
            extra_kwargs = {
                'password': {'write_only': True, 'style': {'input_type': 'password'}},
                'email': ...,  

    Aquí va el validador para el campo de correo electrónico único

    }

    Validador para el campo de correo electrónico único:

    Para hacer que el campo de correo electrónico sea único, puedes usar un validador personalizado.

    python
    from django.core.exceptions import ValidationError
    
    def unique_email_validator(value):
        if User.objects.filter(email=value).exists():
            raise ValidationError("Este correo electrónico ya está en uso.")
    
    class AddBusCompanyUserSerializer(serializers.ModelSerializer):
        position = serializers.PrimaryKeyRelatedField(queryset=StaffPosition.objects.all())
    
        class Meta:
            model = User
            fields = (
                'phone_number',
                'password',
                'position',
                'email',
            )
            extra_kwargs = {
                'password': {'write_only': True, 'style': {'input_type': 'password'}},
                'email': {'validators': [unique_email_validator]}
            }
    

    Uso del serializador:

    Una vez que tengas el serializador actualizado, puedes usarlo para crear o actualizar objetos de usuario:

    python
    serializer = AddBusCompanyUserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
    

    Respondida el Dec 18, 2020 a las 14:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0