Как уже упоминалось, вы можете использовать django -user-session или django -qsessions . Но они включают в себя некоторые другие метаданные, такие как пользовательский агент и IP-адрес, и вы можете не захотеть их по какой-то причине. Затем вам нужно написать свой пользовательский бэкэнд сессии
Я немного подкорректировал пример и создал его в соответствии со своими потребностями.
session_backend.py:
from django.contrib.auth import get_user_model
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
User = get_user_model()
class QuickSession(AbstractBaseSession):
# Custom session model which stores user foreignkey to asssociate sessions with particular users.
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
@classmethod
def get_session_store_class(cls):
return SessionStore
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return QuickSession
def create_model_instance(self, data):
obj = super().create_model_instance(data)
try:
user_id = int(data.get('_auth_user_id'))
user = User.objects.get(pk=user_id)
except (ValueError, TypeError, User.DoesNotExist):
user = None
obj.user = user
return obj
и в settings.py:
SESSION_ENGINE = 'path.to.session_backend'
Чтобы удалить весь сеанс для пользователя:
from session_backend import QuickSession
QuickSession.objects.filter(user=request.user).delete()
Вы можете написать свой собственный метод сохранения для пользовательской модели, чтобы автоматически удалять все сеансы для пользователя, если для поля is_active установлено значение False.
Имейте в виду, что поле пользователя для тех, кто не вошел в систему, будет иметь значение NULL.