如何在django rest API框架中登录自定义用户模型

时间:2019-07-06 06:23:07

标签: python django django-rest-framework

我在models.py中定义了一个自定义用户模型,其名称为Student。该模型继承了Django用户。我可以正确注册学生,但是当我要登录时,出现错误。

我想在学生注册时使用数据库中存在的标识号和学生号登录。

models.py:
class CustomUser(AbstractUser):
    USER_TYPE_CHOICES = ((1, 'student'),
                     (2, 'professor'),)
    username = models.CharField(max_length=50, unique=True)
    user_type=models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES, 
    null=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=100)
    identity_no = models.PositiveIntegerField(default=0)
    email = models.EmailField(max_length=300)



class Student(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    entry_year = models.PositiveIntegerField()
student_no = models.PositiveIntegerField()
serilizers.py:
  class CustomUserForLogin(serializers.ModelSerializer):
      class Meta:
         model = CustomUser
    fields = (
        'identity_no',
    )

  class StudentLoginView(serializers.ModelSerializer):
       user = CustomUserForLogin()

       class Meta:
          model = Student
          fields = [
            "user",
            "student_no", ]

def validate(self, data):  # validated_data
    identity_no = data.get('identity_no')
    print("identity_no", identity_no)
    student_no = data.get("student_no")
    print("student_no", student_no)
    # to search username or email is a user Model
    user = Student.objects.filter(
        Q(identity_no=identity_no) |
        Q(student_no=student_no)
    ).distinct()
    print("user", user)
    if user.exists() and user.count() == 1:
        user_obj = user.first()
    else:
        raise ValidationError("This username or student_no is not existed")
    if user_obj:
        if not user_obj.check_password(student_no):  # Return a boolean of whether the raw_password was correct.
            raise ValidationError("Incorrect Credential please try again")
    return user_obj
  

views.py:

class StudentloginView(APIView):
    permission_classes = [AllowAny]
    serializer_class = StudentLoginView

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = StudentLoginView(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
/ p / system / student-login /

中的

FieldError

无法将关键字“ identity_no”解析为字段。选项包括:courserelationstudent,entry_year,id,student_no,user,user_id

请求方法:POST 要求网址:http://127.0.0.1:8000/system/student-login/ Django版本:1.11.17 异常类型:FieldError 异常值:

无法将关键字“ identity_no”解析为字段。选项包括:courserelationstudent,entry_year,id,student_no,user,user_id

异常位置:names_to_path中的C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ django \ db \ models \ sql \ query.py,行1352 Python可执行文件:C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ python.exe 的Python版本:3.7.3 Python路径:

['C:\ Users \ LELA \ Desktop \ APINewSystem',  'C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ python37.zip',  'C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ DLLs',  'C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ lib',  'C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37',  'C:\ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages']

服务器时间:2019年7月6日,星期六05:37:50 +0000

1 个答案:

答案 0 :(得分:0)

仔细查看学生过滤条件

user = Student.objects.filter(
    Q(identity_no=identity_no) |
    Q(student_no=student_no)
).distinct()

然后在您的模型上:

class CustomUser(AbstractUser):
    ...
    identity_no = ...


class Student(models.Model):
    ...
    user = ...
    student_no = ...

字段identity_nostudent_no在两个独立的模型中-UserStudent。因此,在学生过滤中,您应该对相关的用户模型执行过滤:

user = Student.objects.filter(
    Q(user__identity_no=identity_no) |  # <<<
    Q(student_no=student_no)
).distinct()