问题描述
我是 django rest 框架的新手。我创建了两个注册模型 - 用户模型和医生模型。现在尝试创建 lopin API。如何在1个API下实现两种不同的模型。请建议我在同一登录 API 中验证用户和医生的登录凭据。
models.py
class User(AbstractUser):
username = models.CharField(_('username'),max_length=100)
email = models.EmailField(_('email address'),max_length=100,unique=True)
is_doctor = models.BooleanField(_('doctor status'),default=False)
is_admin = models.BooleanField(_('admin status'),default=False)
phone = models.CharField(_('phone number'),max_length=50)
address = models.TextField(_('address'))
dob = models.CharField(_('date_of_birth'),max_length=20)
education = models.CharField(_('education'),default='',editable=True)
work_status = models.CharField(_('work status'),editable=True)
gender = models.CharField(_('gender'),max_length=10)
city = models.CharField(_('city'),max_length=50)
role = models.CharField(_('role'),max_length=10,default='user',editable=False)
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
USERNAME_FIELD = 'email'
required_FIELDS = ['username']
def get_email(self):
return f'{self.email}'
def __str__(self):
return f'{self.email}'
def create_superuser(self,username,email,password):
"""
Creates and saves a superuser with the given email and password.
"""
# user = self.createuser(username,# password=password,# )
user = self.model(
email=self.normalize_email(email)
)
user.username = username
user.set_password(password)
user.is_admin = True
user.save(using=self._db)
return user
class Doctor(models.Model):
doctor_name = models.CharField(max_length=20)
doctor_reg_id = models.CharField(max_length=100)
qualification = models.CharField(max_length=200)
hospital_address = models.TextField()
phone = models.CharField(max_length=200)
email = models.EmailField(max_length=100,unique=True)
password = models.CharField(max_length=100)
specialization = models.CharField(max_length=100,editable=True)
about_me = models.TextField()
role = models.CharField(max_length=10,default='doctor',editable=False)
serializers.py
class UserRegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id','username','email','password','phone','address','dob','education','work_status','gender','city','role']
extra_kwargs = {'password':{'write_only':True}}
def create(self,validated_data):
user = User.objects.create_user(validated_data['username'],validated_data['email'],validated_data['password'])
return user
views.py
class Register_Users(APIView):
permission_classes = [AllowAny]
serializer_class = UserRegisterSerializer
def post(self,request):
data = {}
serializer = UserRegisterSerializer(data=request.data)
if serializer.is_valid():
account = serializer.save()
account.save()
token = Token.objects.get_or_create(user=account)[0].key
data['message'] = "Successful Registration"
# data['email'] = account.email
# data['username'] = account.username
# data['token'] = token
return Response(serializer.data)
else:
return Response(serializer.errors)
class Doctor_Registration(APIView):
permission_classes = [AllowAny]
serializer_class = DoctorSerializer
def post(self,request):
data = {}
serializer = DoctorSerializer(data=request.data)
if serializer.is_valid():
account = serializer.save()
account.save()
token = Token.objects.get_or_create(user=account)[0].key
# data['email'] = account.email
# data['username'] = account.username
# data['token'] = token
return Response(serializer.data)
else:
return Response(serializer.errors)
class LoginUser(APIView):
permission_classes = [AllowAny]
# queryset = User.objects.all()
serializer_class = UserLoginSerializer
def post(self,request):
data = {}
serializer = UserLoginSerializer(data=request.data)
if serializer.is_valid():
try:
Account = User.objects.get(email=serializer.validated_data['email'],password=serializer.validated_data['password'])
token = Token.objects.get_or_create(user=Account)[0].key
login(request,Account)
data["message"] = "Login Successful"
data["token"] = token
data["username"] = request.user.username
data["role"] = request.user.role
return Response(data)
except:
return Response(serializer.errors)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)