Добавить дополнительную информацию о модели в токен JWT
Я создаю приложение для обмена сообщениями. У меня есть 3 модели в моем бэкенде Django. У меня есть модель профиля, которая хранит данные пользователя & с какой комнатой он связан (чтобы каждый раз, когда он входит в систему, его комнаты появлялись в боковой панели, как в WhatsApp). В модели профиля у меня есть отношения "многие ко многим" с моделью комнаты, которая хранит список комнат. Так как я использую веб-токен JWT для аутентификации, я хочу, чтобы модель профиля пользователя/комнаты этого пользователя были добавлены в токен, чтобы я мог получить информацию из токена напрямую, но я не знаю, как добавить информацию об этих полях в представление токена. Я уже настроил представление получения токена, где я добавил имя пользователя как дополнительное, но мне нужно добавить список комнат тоже.
Заранее спасибо за помощь.
#model.py
from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.contrib.auth.models import User
# Create your models here.
class Room(models.Model):
name = models.CharField(max_length=100,blank=True,null=True)
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
rooms = models.ManyToManyField(Room)
class Message(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE,blank=False,null=True)
message = models.TextField(max_length=500,blank=False,null=True)
name = models.CharField(max_length=100,blank=True,null=True)
room = models.ForeignKey(Room,on_delete=models.CASCADE,null=True)
time = models.DateTimeField(auto_now_add=True)
received = models.BooleanField(default=False,null=True)
#views.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['name'] = user.username
**here i want to have a token['room'] that will return me the list of rooms**
return token
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
Сначала получите Profile
: без обратной связи его можно получить через
profile = Profile.objects.get(user=user)
Затем получите комнаты:
rooms = profile.rooms.all()
В конце вы должны подумать о том, какую информацию о комнатах вы храните в токене. name
может быть пустым и не обязательно должен быть уникальным. Поэтому лучше хранить id
:
token['room'] = [r.id for r in rooms]
ну, я выяснил это сам. это очень просто. просто получите все данные профиля этого пользователя. теперь пройдитесь по списку комнат, используя rooms.all()
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['name'] = user.username
room = Profile.objects.get(user=user)
token['rooms'] = [[r.name,r.id] for r in room.rooms.all()]
print([r for r in room.rooms.all()])
# ...
return token