MultipleObjectsReturned в /profile/ get() вернул более одного CustomUser - он вернул 2

Модель CustomUser хранит данные учетной записи пользователя. После входа в систему профиль конкретного пользователя должен быть получен с помощью токена, сгенерированного во время регистрации.

Я сделал phone_number в качестве первичного ключа и уникальный атрибут установлен в True. Мой код ведет себя правильно, когда есть только один пользователь, но >1 пользователь, данные всех существующих пользователей извлекаются, поэтому и появляется эта ошибка!

Вот структура модели

class CustomUser(AbstractUser):
first_name = models.CharField(null=True, blank=True, max_length= 50)
last_name = models.CharField(null=True, blank=True, max_length= 50)
username = models.CharField(null=True, blank=True, max_length= 12)
phone_number = models.CharField(primary_key=True, max_length= 10,unique=True)
dob = models.CharField(max_length=12, null=True, blank=True)
email = models.EmailField(null=True, blank=True)
address = models.CharField(max_length= 500,null=True, blank=True)
pincode = models.CharField(max_length=10, blank=True,null=True)
state = models.CharField(max_length= 256,null=True, blank=True)
district = models.CharField(max_length= 56,null=True, blank=True)
otp_verified = models.BooleanField(null=True,blank=True, default=False)
date_joined = models.DateTimeField(null=True,blank=True)
last_login = models.DateTimeField(null=True,blank=True)
loyality_level = models.IntegerField(null=True,blank=True)
loyality_points = models.IntegerField(null=True,blank=True)
gender = models.CharField(max_length= 2,null=True, blank=True)
user_type = models.CharField(max_length= 2,null=True, blank=True)

objects = MyUserManager()
search_fields = ("",)
USERNAME_FIELD = 'phone_number'

def __str__(self):
    return self.phone_number

@property
def token(self):
    return self._generate_jwt_token()

def _generate_jwt_token(self):
    return str(AccessToken.for_user(self))

Вот мое представление для получения профиля с помощью APIView

class ProfileView(APIView):
authentication_class = [JWTAuthentication]
permission_classes = [IsAuthenticated]
try:
    def get(self, request):
        print(request)
        user = model_to_dict(request.user)
        print(user)
        del user['password']
        return Response({"ok": True, "userData": user},status=200)
except Exception as e:
    print("::",e,"::")

Вот представление для регистрации/подписки пользователя

class CreateUserView(APIView):
permission_classes = (AllowAny, )
def post(self, request):
    data = request.data
    print(data)
    first_name = data.get("first_name")
    last_name = data.get("last_name")
    email = data.get("email")
    dob = data.get("dob")
    phone_number = data.get("phone_number")
    address = data.get("address")
    pincode = data.get("pincode")
    state = data.get("state")
    district = data.get("district")
    password = make_password(data.get("password"))
    print(data)
    try:
        if not CustomUser.objects.filter(phone_number=phone_number).exists():
            print(email)
            print("entered")
            if email == "":
                user = CustomUser(
                    first_name=first_name,
                    last_name=last_name,
                    email=email,
                    dob=dob,
                    phone_number=phone_number,
                    address=address,
                    pincode=pincode,
                    state=state,
                    district=district,
                    password=password,
                    username="user"
                )
                user.save()
                token = user.token
                user = model_to_dict(user)
                del user["password"]
            else:
                user = CustomUser(
                        first_name=first_name,
                        last_name=last_name,
                        email=email,
                        phone_number=phone_number,
                        address=address,
                        pincode=pincode,
                        state=state,
                        district=district,
                        password=password,
                        dob=dob,
                        username="user"
                    )
                user.save()
                token = user.token
                user = model_to_dict(user)
                del user["password"]
                subject = 'Regarding new user registration'
                message = f'Hurrah! your registration is officially complete with this process.'
                email = EmailMessage(subject,message, to=[email])
                email.send()
        else:
            return Response({"ok": False, "message": "Your number is already registered!"}, status=401)
    except Exception as e:
        return Response({"ok": False, "message": "Unsuccessful attempt!" + str(e)}, status=401)
    return Response({"ok": True, "message": "User created and confirmation mail sent successfully!", "user": user, "token": token},status=200)

Вот представление для входа пользователя в систему

class LoginView(APIView):
def post(self,request):
    phone_number = request.data.get("phone_number")
    password = request.data.get("password")
    if CustomUser.objects.filter(phone_number=phone_number).exists():
        user = CustomUser.objects.get(phone_number=phone_number)
        if check_password(password, user.password):
            return Response({"user":model_to_dict(user), "token":user.token}, status =200)
        else:
            return Response({"message":"Invalid credentials"}, status=401)
    else:
        return Response({"message":"Invalid credentials"}, status=401)

У вас есть определение метода внутри попытки, это не нормально. Я думаю, вы имели в виду поместить try внутри метода.

try:
    def get(self, request):
        print(request)
        user = model_to_dict(request.user)
        print(user)
        del user['password']
        return Response({"ok": True, "userData": user},status=200)
except Exception as e:
    print("::",e,"::")
Вернуться на верх