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

Django中ActiveSession遇MultipleObjectsReturned异常的解决方法

解决Django中ActiveSession多记录导致的登录异常问题

临时修复:清理现有重复数据

先处理数据库中已存在的重复会话记录,可通过Django Shell执行以下命令:

from api.authentication.models.active_session import ActiveSession
from django.contrib.auth.models import User
from django.db.models import Count

# 筛选出存在多条会话记录的用户
duplicate_user_ids = ActiveSession.objects.values('user')\
    .annotate(session_count=Count('id'))\
    .filter(session_count__gt=1)\
    .values_list('user', flat=True)

# 对每个用户保留最新会话,删除旧记录
for user_id in duplicate_user_ids:
    # 按创建时间倒序排序(无created_at字段可改用id字段)
    user_sessions = ActiveSession.objects.filter(user_id=user_id).order_by('-created_at')
    # 删除除第一条外的所有旧会话
    if len(user_sessions) > 1:
        user_sessions[1:].delete()

修改查询代码避免异常

将原代码中会触发异常的get()方法,替换为兼容多记录场景的逻辑:

  • 直接获取用户最新的会话记录:
# 按创建时间倒序取第一条,无记录时返回None
session = ActiveSession.objects.filter(user=user).order_by('-created_at').first()
  • 若业务要求用户只能有一条会话,可先清理旧会话再获取:
# 删除用户所有旧会话,仅保留最新的
latest_session = ActiveSession.objects.filter(user=user).latest('created_at')
ActiveSession.objects.filter(user=user).exclude(id=latest_session.id).delete()
# 此时get()可安全执行
session = ActiveSession.objects.get(user=user)

长期预防:从根源避免重复会话

1. 给模型添加唯一约束

修改ActiveSession模型,给user字段添加唯一约束,确保数据库层面禁止同一用户存在多条会话:

class ActiveSession(models.Model):
    user = models.ForeignKey(
        User, 
        on_delete=models.CASCADE,
        unique=True  # 添加唯一约束
    )
    # 其他字段(如expires_at、session_key等)...

注意:添加约束前必须先清理完现有重复数据,否则数据库迁移会失败。

2. 优化会话创建逻辑

在创建新会话前,先检查用户是否已有活跃会话,存在则更新而非重复创建:

# 创建会话前的校验逻辑
existing_session = ActiveSession.objects.filter(user=user).first()
if existing_session:
    # 更新现有会话的过期时间或其他字段
    existing_session.expires_at = new_expiration_time
    existing_session.save()
    session = existing_session
else:
    # 无会话时创建新记录
    session = ActiveSession.objects.create(user=user, ...)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:37:12