Django Serializer - как проверить, является ли ListField действительным?

В настоящее время я работаю над приложением для социальных сетей. В этом приложении текущие пользователи могут приглашать своих друзей по электронной почте присоединиться к приложению (в частности, присоединиться к "каналу" приложения, как Discord). Я работаю над модульными тестами, чтобы убедиться, что электронные письма действительны. Я впервые работаю с сериализаторами и пытаюсь преодолеть некоторые проблемы, с которыми я столкнулся.

Функциональность: пользователь вводит адрес электронной почты друга. Для целей данного теста адрес электронной почты должен быть длиной не менее 6 символов. Поэтому что-то вроде "a@a.co" (6 символов) будет приемлемо, а "a@a.c" (5 символов) не будет принято. Пользователи могут вводить до 10 электронных адресов одновременно.

В настоящее время я пытаюсь решить, какую функцию использовать для "is_valid"? Я знаю, что в Django forms есть что-то для этого, но я не нашел удовлетворительного метода для сериализаторов.

Вот что в настоящее время находится в файле serializers.py.

from django.core.validators import MinValueValidator, MaxValueValidator
from rest.framework.fields import ListField
from rest.framework import serializers

class EmailList(ListField):
 """Will validate the email input"""

 def to_internal_value(self, data):
 # if the EmailList is not valid, then a ValidationError should be raised--here's where I'm wondering what to put
 raise serializers.ValidationError({"invalid_email": "Email is invalid, please recheck".})

class EmailListSerializer(serializers.Serializer):
"""Serializer for the email list"""
 emails = EmailList(
  required=True
  child=Serializers.CharField(
   validators= [
    MinLengthValidator(6, message="too short"),
    MaxLengthValidator(50, message="too long"),
    ],
   ),
  max_length=10,
  error_messages = ({"invalid_email": "Email is invalid, please recheck."}
 )

Может ли кто-нибудь подсказать, какую функцию я должен поместить в метод to_internal_value класса EmailList, чтобы проверить, что электронные письма действительны?

если вы получаете письма в списке, то напишите цикл for для получения каждого письма для проверки, в вашей функции to_internal_value напишите код как показано ниже:

from django.core.validators import validate_email
    
def to_internal_value(data):
    for email in data:
        try:
            validate_email(email)
        except:
            raise serializers.ValidationError({"invalid_email": "Email is invalid, please recheck".})

дайте мне знать, работает ли это для вас или нет

Вам не нужно реализовывать пользовательское поле сериализатора по указанной вами причине. Все, что вам нужно сделать, это иметь поле email под полем списка. Для минимальной и максимальной длины вы можете просто передать kwargs, потому что EmailField наследует CharField. В случае, если вы хотите настроить сообщение об ошибке, вы можете передать error_messages kwarg в поле email.

class EmailSerialilizer(serializers.Serializer):
      emails = serilizers.ListField(child=Serializers.EmailField(
               min_length = 6, 
               max_length = 50,
               error_messages = {
               "invalid": "Email is invalid, please recheck"
               }
      ),
Вернуться на верх