Как войти в пользовательскую модель пользователя в рамках django rest API - PullRequest
0 голосов
/ 06 июля 2019

Я определил пользовательскую модель пользователя в models.py, имя которой - Student. Эта модель наследует пользователя Django. Я могу правильно зарегистрировать студента, но когда я хочу войти, я получаю сообщение об ошибке.

Я хочу войти с идентификатором no и номер студента, который существует в базе данных, когда студент регистрируется.

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)

FieldError at / system / student-login /

Невозможно разрешить ключевое слово identity_no в поле. Возможные варианты: courserelationstudent, entry_year, id, student_no, user, user_id

Способ запроса: POST URL запроса: http://127.0.0.1:8000/system/student-login/ Джанго версия: 1.11.17 Тип исключения: FieldError Значение исключения:

Невозможно разрешить ключевое слово identity_no в поле. Возможные варианты: courserelationstudent, entry_year, id, student_no, user, user_id

Расположение исключения: C: \ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ django \ db \ models \ sql \ query.py в names_to_path, строка 1352 Исполняемый файл Python: C: \ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ python.exe Версия Python: 3.7.3 Python Path:

[ 'C: \ Users \ LELA \ Desktop \ APINewSystem', 'C: \ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ python37.zip', 'C: \ Users \ LELA \ AppData \ Local \ Programs \ Python \ Python37 \ DLL файлы', '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 \ сайт-пакеты']

Время на сервере: суббота, 6 июля 2019 г. 05:37:50 + 0000

1 Ответ

0 голосов
/ 06 июля 2019

Посмотрите поближе на фильтрацию студента:

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_no и student_no находятся в двух отдельных моделях - User и Student.Таким образом, в фильтрации ваших студентов вы должны выполнить фильтрацию по соответствующей модели пользователя:

user = Student.objects.filter(
    Q(user__identity_no=identity_no) |  # <<<
    Q(student_no=student_no)
).distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...