Actualmente estoy tratando de devolver datos en formato de vista json o api con mis siguientes campos de texto (correo electrónico, país y número de teléfono), sin embargo, también tengo 2 funciones de validación para validar el valor en los campos de correo electrónico y número de teléfono que requieren la obtención () y también usarlo para pasar el texto como argumento. No estoy seguro de si las 2 funciones de validación funcionan o no, como cuando ingresé un correo electrónico no válido, todavía se acepta como datos válidos. Dígame qué estoy haciendo incorrectamente y qué cambios se deben hacer en mi código actual.

/* serializers.py */
import re
import phonenumbers
from rest_framework import serializers
from .models import validation
from phonenumbers import carrier
from validate_email import validate_email


class validationSerializer(serializers.ModelSerializer):

    class Meta:
        model = validation
        fields = '__all__'

    def clean_email(self):
        email = self.cleaned_data.get("email")
        if not validate_email(email, check_mx=True, verify=True):
            raise serializers.ValidationError("Invalid email")
        return email

    def clean_phone_number(self):
        phone_number = self.cleaned_data.get("phone_number")
        clean_number = re.sub("[^0-9&^+]", "", phone_number)
        alpha_2 = self.cleaned_data.get("country")
        z = phonenumbers.parse(clean_number, "%s" % (alpha_2))
        if len(clean_number) > 15 or len(clean_number) < 3:
            raise serializers.ValidationError(
                "Number cannot be more than 15 or less than 3")
        if not phonenumbers.is_valid_number(z):
            raise serializers.ValidationError(
                "Number not correct format or non-existent")
        if carrier.name_for_number(z, "en") == '':
            raise serializers.ValidationError("Please enter a mobile number")
        return phonenumbers.format_number(
            z, phonenumbers.PhoneNumberFormat.E164)

/* models.py */
from django.db import models


class validation(models.Model):
    email = models.EmailField()
    country = models.CharField(max_length=2)
    phone_number = models.CharField(max_length=100)

    def __str__(self):
        return self.email
0
Jackson_Stake 4 oct. 2019 a las 06:58

3 respuestas

La mejor respuesta

Clean se usa con modelos y validate se usa con serializadores. Por lo tanto, debe usar validar en lugar de limpiar. Formatee su código de acuerdo con este ejemplo. Además, en lugar de self.cleaned_data, use self.validated_data.

from rest_framework import serializers

class EventSerializer(serializers.Serializer):
    description = serializers.CharField(max_length=100)
    start = serializers.DateTimeField()
    finish = serializers.DateTimeField()

    def validate(self, data):
        """
        Check that start is before finish.
        """
        if data['start'] > data['finish']:
            raise serializers.ValidationError("finish must occur after start")
        return data

    def validate_description(self, value):
        """
        Check that event is related to django.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("It is not a django event")
        return data

En su caso, puede reescribir la validación de correo electrónico de esta manera.

def validate_email(self):
    email = self.validated_data.get("email")
    if not self.validate_email(email, check_mx=True, verify=True):
        raise serializers.ValidationError("Invalid email")
    return email
0
Deepak K 4 oct. 2019 a las 07:11

Su declaración if no regresa de la función, debería dar un error de validación pero después de eso aún devolverá el número de teléfono.

Puede devolver la función dentro de la instrucción if o puede usar una estructura de la siguiente manera:

if not phonenumbers.is_valid_number(z):
   raise serializers.ValidationError(
      "Number not correct format or non-existent")
elif carrier.name_for_number(z, "en") == '':
   raise serializers.ValidationError("Please enter a mobile number")
else:
   return phonenumbers.format_number(
         z, phonenumbers.PhoneNumberFormat.E164)
0
Shishdem 4 oct. 2019 a las 05:24

Quizás esté buscando Validadores, puede crear una función de validación y especificar en campo bajo kwargs validators=

Una parte del enlace:

def validate_even(value):
    if value % 2 != 0:
        raise ValidationError(
            _('%(value)s is not an even number'),
            params={'value': value},
        )

-----------
even_field = models.IntegerField(validators=[validate_even])
0
NeverHopeless 4 oct. 2019 a las 09:58
58229721