Мои функции не работают в моем проекте Django - PullRequest
0 голосов
/ 04 октября 2019

В настоящее время я пытаюсь вернуть данные в формате представления json или api со следующими текстовыми полями (адрес электронной почты, страна и номер телефона), однако у меня также есть 2 функции проверки для проверки значения в полях адреса электронной почты и номера телефона, которыетребуется метод get (), а также использовать его для передачи текста в качестве аргумента. Я не уверен, работают ли 2 функции проверки или нет, как при вводе недействительного электронного письма, оно все еще принимается как действительные данные. Пожалуйста, скажите мне, что я делаю неправильно и какие изменения необходимо внести в мой текущий код.

/* 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

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Clean используется с моделями, а validate используется с сериализаторами. Поэтому вы должны использовать validate вместо clean. Отформатируйте ваш код в соответствии с этим примером. Кроме того, вместо self.cleaned_data используйте 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

В вашем случае вы можете переписать подтверждение электронной почты следующим образом.

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 голосов
/ 04 октября 2019

Возможно, вы ищете Валидаторы , вы можете создать функцию проверки и указать ее в поле под kwargs validators=

Часть по ссылке:

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 голосов
/ 04 октября 2019

Ваш оператор if не возвращает функцию, он должен выдать ошибку проверки, но после этого он все равно вернет номер телефона.

Либо вы можете вернуть функцию в операторе if, либо использовать следующую структуру:

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