Задать вопрос
@AlexMine
Учусь

Как при запросе пользователя, вывести его последний онлайн?

Добрый день, есть две таблицы, одна с пользователями, другая куда пишется последнее обращение к сервису. Есть следующие модели:
class Base(AsyncAttrs, DeclarativeBase):
    pass

class TimestampMixin(object):
    created_at: Mapped[datetime] = mapped_column(
        insert_default=datetime.utcnow
    )
    updated_at: Mapped[datetime] = mapped_column(
        default=datetime.utcnow,
        onupdate=datetime.utcnow
    )


class User(Base, TimestampMixin):
    __tablename__ = 'users'

    id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True,
                                     default=uuid.uuid4)
    login: Mapped[str] = mapped_column(unique=True)
    name: Mapped[str] = mapped_column(String(15))
    onlines: Mapped[List["UserOnline"]] = relationship(
        cascade="all, delete-orphan"
    )

    def __str__(self) -> str:
        return f"id: {self.id}\n"

class UserOnline(Base, TimestampMixin):
    __tablename__ = "users_onlines"

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
    user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
    user: Mapped["User"] = relationship(back_populates="onlines")


Могу ли я, создать у класса User поле, которое при выполнение select, будет считать последний онлайн пользователя? Чтобы я мог к нему обратиться по типу last_online = user.last_online
  • Вопрос задан
  • 134 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Правильным будет сделать так, вам нужно view который принимает post (или get не сильно принципиально) запрос, можно без тела запроса. В логике view определите функцию которая будет обновлять необходимое вам поле. На стороне браузера реализуйте функцию которая раз в 5 секунд отправляет post запрос на данную view. таким образом вы сможете точно знать пользователь онлайн или нет.

Реализация через SQL возможна, но пользователь может быть на сайте но не совершать никаких действий, в таком случае реализация через SQL не будет давать ожидаемого результата.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы