Серверная часть Django, требуется электронная почта или телефон

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Является ли электронная почта автоматически обязательной при использовании Django?

Я пытаюсь создать API, в котором требуется электронная почта или телефон.

Это серверная часть, которую я создал

 from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

from accounts.models import User

class UserBackend(ModelBackend):

    def authenticate(self, request, **kwargs):
        email = kwargs['username']
        phone_number = kwargs['username']
        password = kwargs['password']
        try:
            app_user = User.objects.get(email=email)
            if app_user.check_password(password) is True :
                return app_user
        
        except User.DoesNotExist:
            app_user = User.objects.get(phone_number=phone_number)
            if app_user .check_password(password) is True :
                return app_user 

        except User.DoesNotExist:
            pass
  

введите описание изображения здесь

Похоже, не удается избавиться от электронной почты

Ответ №1:

 def validate(self, attrs):

    phone_number_ = attrs.get('phone_number', '')
    email_ = attrs.get('email', '') # get - Provide defualt param is email not inserted
    username_ = attrs.get('username', '')
    
    if phone_number_ == '' and  email_== '':
        raise serializers.ValidationError('Enter email or phone')

    elif User.objects.filter(email=email_).exists():
        if email_ != '': 
            raise serializers.ValidationError(
            {'email',('Email is already in use')})

    elif User.objects.filter(phone_number=phone_number_).exists():
        if phone_number_ != '':
            raise serializers.ValidationError(
            {'phone_number',('Phone Number is already in use')})
            
    elif User.objects.filter(username=username_).exists():
        raise serializers.ValidationError(
            {'username',('Username is already in use')})

    return super().validate(attrs)
  

Добавил это в мой сериализатор. Я не очень хороший программист, но все изменения, которые я внес, имели для меня смысл. Похоже, он также работает отлично, будет обновляться, если я обнаружу ошибки.

Номер телефона не обязательно должен быть уникальным не знаю почему?