Добавить дополнительную информацию о модели в токен 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
Вернуться на верх