django rest 框架中的两种不同模型

问题描述

我是 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 (将#修改为@)