Пользовательская валидация электронной почты в регистрации Djoser не работает

Я использую Django с Djoser для аутентификации, и мне нужно ограничить регистрацию пользователей только теми электронными адресами, которые указаны в моей таблице kontakte. Однако моя пользовательская валидация электронной почты, похоже, не вызывается. Вот детали:

Конфигурация джосера:

DJOSER = {
    "PASSWORD_RESET_CONFIRM_URL": "auth/password-reset-confirm?uid={uid}&token={token}",
    "ACTIVATION_URL": "auth/activation?uid={uid}&token={token}",
    "SEND_ACTIVATION_EMAIL": True,
    "USER_CREATE_PASSWORD_RETYPE": True,
    "PASSWORD_RESET_CONFIRM_RETYPE": True,
    "PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND": True,
    "TOKEN_MODEL": None,
    "FROM_EMAIL": getenv("FROM_EMAIL"),
    "SERIALIZERS": {
        "user_create": "users.serializers.CustomUserCreateSerializer",
    },
}

Пользовательский сериализатор:

from rest_framework import serializers
from djoser.serializers import UserCreateSerializer
from .models import UserAccount, Kontakte

class CustomUserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        model = UserAccount
        fields = ("email", "password", "is_active", "is_staff", "is_superuser")

    def validate_email(self, value):
        if not Kontakte.objects.filter(email=value).exists():
            raise serializers.ValidationError("You are not allowed to register.")
        return value

    def create(self, validated_data):
        user = UserAccount.objects.create_user(
            email=validated_data["email"], password=validated_data["password"]
        )
        return user

Проблема:

  • Пользовательская проверка электронной почты в CustomUserCreateSerializer, похоже, не вызывается во время регистрации.
  • Мне нужно, чтобы регистрация проверяла таблицу kontakte и отказывала, если email не найден.

То, что я пробовал:

  • Убедились, что настройки DJOSER указывают на пользовательский сериализатор.
  • Добавил оператор печати в validate_email, чтобы проверить, вызывается ли он (не вызывается).

Любой совет о том, что может быть не так или как обеспечить использование моей пользовательской валидации, будет очень признателен. Спасибо!

Иногда лучший способ проверить достоверность чего-либо - не делать этого вообще; пусть это сделает база данных. Здесь вы можете поступить именно так. Поскольку у вас есть таблица pre-authorized, создайте FK к этой таблице из вашей таблицы UserAccount; затем перехватите ошибку нарушения FK, когда она возникнет.
К сожалению, я недостаточно хорошо разбираюсь в вашем менеджере обфускации (Django/Djoser), поэтому я приведу сырой sql для выполнения этой задачи: (см. demo здесь)

create table kontakte(valid_email text primary key); 
  
create table registrations(id    integer generated always as identity
                                 primary key
                  ,name  text
                  ,email text
                  ,constraint valid_user_email 
                              foreign key(email) 
                              references kontakte(valid_email) 
                  );
             
             

Спасибо! Я обновил свои файлы в соответствии с вашим предложением, и это сработало.

Вернуться на верх