Запрос id в почтовом запросе возвращает none
Я пытаюсь создать приложение для социальных сетей на Django с использованием базы данных mongo, где пользователи могут регистрироваться и следить/отслеживать друг друга.
Вот код для models.py
from django.db import models
import uuid
from datetime import datetime
from django.contrib.auth.models import AbstractUser
from django.contrib.auth import get_user_model
# Create your models here.
class User(AbstractUser):
username = models.CharField(max_length=255, unique=True)
email = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255)
class FollowersCount(models.Model):
follower = models.CharField(max_length=100)
user = models.CharField(max_length=100)
Вот код для views.py
# sign in
class LoginView(APIView):
def post(self, request):
email = request.data['email']
password = request.data['password']
user = User.objects.filter(email=email).first()
if user is None:
raise AuthenticationFailed('User not found!')
if not user.check_password(password):
raise AuthenticationFailed('Incorrect password!')
payload = {
'id': user.id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
'iat': datetime.datetime.utcnow()
}
token = jwt.encode(payload, 'secret', algorithm='HS256')
response = Response()
response.set_cookie(key='jwt', value=token, httponly=True)
response.data = {
'jwt': token
}
return response
# logged in user follows / unfollows user based on id
class FollowView(APIView):
def post(self, request):
token = request.COOKIES.get('jwt')
if not token:
raise AuthenticationFailed('Unauthenticated!')
try:
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
except jwt.ExpiredSignatureError:
raise AuthenticationFailed('Unauthenticated!')
follower = User.objects.filter(id=payload['id']).first()
print(follower)
if request.method == 'POST':
user = request.POST.get('id')
user_followed = user
print(user_followed)
response = Response()
if FollowersCount.objects.filter(follower=follower, user=user_followed).first():
delete_follower = FollowersCount.objects.get(follower=follower, user=user_followed)
delete_follower.delete()
response.data = {
'message': str(follower) + ' removed ' + str(user)
}
return response
else:
new_follower = FollowersCount.objects.create(follower=follower, user=user_followed)
new_follower.save()
response.data = {
'message': str(follower) + ' followed ' + str(user)
}
return response
Однако, для следующей строки кода, когда я отправляю POST запрос для follow, я получаю следующую ошибку:
if request.method == 'POST':
user = request.POST.get('id')
user_followed = user
print(user_followed)
error:
Вот как выглядит мой POST-запрос postman для http://127.0.0.1:8000/api/follow:
{
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZXhwIjoxNjc0MjkxNTI5LCJpYXQiOjE2NzQyODc5Mjl9.SvBHTe5hxuDzWrNeLQJq6JudMo9i6k1GQI-Ndi_ODgg",
"id": "2"
}
Здесь jwt - это токен входящего пользователя, а id - идентификатор пользователя, за которым нужно следить. Почему id пользователя, за которым нужно следить, отсутствует в выводе на консоль?
Любая помощь будет оценена по достоинству. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Вы получаете ошибку здесь:
new_follower = FollowersCount.objects.create(follower=follower, user=user_followed)
new_follower.save() <----
Тогда вопрос: почему?
Что ж, если взглянуть на ваши модели, вы используете CharField
вместо ForeignKey
для своих пользователей:
follower = models.CharField(max_length=100)
user = models.CharField(max_length=100)
Но, когда вы пытаетесь создать новый объект FollowersCount
, вы передаете объект User
в follower
и user
, который, очевидно, не является значением, совместимым с CharField
: отсюда и ошибка.
Вам следует преобразовать ваши CharField
s в ForeignKey
s:
class FollowersCount(models.Model):
follower = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
Теперь, когда вы создаете новый объект FollowersCount
, он будет принимать объекты User
, которые вы ему передаете, потому что теперь он будет ForeignKey
, а не CharField
.