You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django的JWT令牌中添加用户关联的房间列表信息?

解决方案

要在JWT令牌中添加用户关联的房间列表,你可以通过user.profile访问用户的Profile实例(二者是一对一关联),然后取出关联的Room数据并序列化为可存入JWT的格式(比如包含房间ID和名称的字典列表)。

修改你的MyTokenObtainPairSerializer代码如下:

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
        
        # 获取用户关联的房间列表,处理可能不存在Profile的情况
        try:
            # 提取房间的id和name,组成字典列表
            rooms = user.profile.rooms.all().values('id', 'name')
            # 将QuerySet转换为列表,以便存入JWT
            token['rooms'] = list(rooms)
        except user.profile.RelatedObjectDoesNotExist:
            # 如果用户没有Profile,返回空列表
            token['rooms'] = []

        return token

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

关键说明:

  • 访问关联数据:因为Profile和User是一对一关联,所以可以直接通过user.profile获取用户的Profile对象。
  • 序列化房间数据:使用values('id', 'name')可以直接从QuerySet中提取需要的字段,避免序列化整个Room模型实例(JWT仅支持可JSON序列化的数据)。
  • 异常处理:添加try-except块处理用户未创建Profile的情况,避免抛出RelatedObjectDoesNotExist异常导致令牌生成失败。

额外优化建议:

你可以在User模型创建时自动生成对应的Profile实例,比如通过信号:

# 在models.py中添加信号
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

这样就能确保每个用户都有对应的Profile,无需再处理异常。

内容的提问来源于stack exchange,提问作者Naimur Sharon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:36:17