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,"::")