diff --git a/backend/app/core/base_model.py b/backend/app/core/base_model.py index 339494b4c..7bfc18bb5 100644 --- a/backend/app/core/base_model.py +++ b/backend/app/core/base_model.py @@ -1,6 +1,6 @@ from datetime import UTC, datetime -from sqlalchemy import Boolean, DateTime, ForeignKey, Index, Integer, MetaData, String +from sqlalchemy import Boolean, DateTime, Index, Integer, MetaData, String from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import DeclarativeBase, Mapped, declared_attr, mapped_column, relationship @@ -132,7 +132,6 @@ class UserMixin(MappedBase): created_id: Mapped[int | None] = mapped_column( Integer, - ForeignKey("sys_user.id", ondelete="SET NULL", onupdate="CASCADE"), default=None, nullable=True, index=True, @@ -140,7 +139,6 @@ class UserMixin(MappedBase): ) updated_id: Mapped[int | None] = mapped_column( Integer, - ForeignKey("sys_user.id", ondelete="SET NULL", onupdate="CASCADE"), default=None, nullable=True, index=True, @@ -149,7 +147,6 @@ class UserMixin(MappedBase): deleted_id: Mapped[int | None] = mapped_column( Integer, - ForeignKey("sys_user.id", ondelete="SET NULL", onupdate="CASCADE"), default=None, nullable=True, index=True, @@ -161,7 +158,7 @@ def created_by(self): """创建人关联关系""" return relationship( "UserModel", - foreign_keys=lambda: self.created_id, # pyright: ignore[reportArgumentType] + primaryjoin=f"foreign({self.__name__}.created_id) == remote(UserModel.id)", uselist=False, ) @@ -170,7 +167,7 @@ def updated_by(self): """更新人关联关系""" return relationship( "UserModel", - foreign_keys=lambda: self.updated_id, # pyright: ignore[reportArgumentType] + primaryjoin=f"foreign({self.__name__}.updated_id) == remote(UserModel.id)", uselist=False, ) @@ -179,6 +176,6 @@ def deleted_by(self): """删除人关联关系""" return relationship( "UserModel", - foreign_keys=lambda: self.deleted_id, # pyright: ignore[reportArgumentType] + primaryjoin=f"foreign({self.__name__}.deleted_id) == remote(UserModel.id)", uselist=False, ) diff --git a/backend/app/modules/system/user/model.py b/backend/app/modules/system/user/model.py index 4d3a7c6a2..7f94679f0 100644 --- a/backend/app/modules/system/user/model.py +++ b/backend/app/modules/system/user/model.py @@ -81,10 +81,25 @@ class UserModel(ModelMixin, UserMixin): status: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="状态(0:启动 1:停用)") description: Mapped[str | None] = mapped_column(Text, default=None, nullable=True, comment="备注") - dept_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("sys_dept.id", ondelete="SET NULL", onupdate="CASCADE", use_alter=True), nullable=True, index=True, comment="部门ID") + dept_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("sys_dept.id", ondelete="SET NULL", onupdate="CASCADE"), nullable=True, index=True, comment="部门ID") dept: Mapped["DeptModel | None"] = relationship(back_populates="users", foreign_keys=[dept_id]) roles: Mapped[list["RoleModel"]] = relationship(secondary="sys_user_roles", back_populates="users") positions: Mapped[list["PositionModel"]] = relationship(secondary="sys_user_positions", back_populates="users") - created_by: Mapped["UserModel | None"] = relationship("UserModel", foreign_keys="UserModel.created_id", remote_side="UserModel.id", uselist=False, viewonly=True) - updated_by: Mapped["UserModel | None"] = relationship("UserModel", foreign_keys="UserModel.updated_id", remote_side="UserModel.id", uselist=False, viewonly=True) - deleted_by: Mapped["UserModel | None"] = relationship("UserModel", foreign_keys="UserModel.deleted_id", remote_side="UserModel.id", uselist=False, viewonly=True) + created_by: Mapped["UserModel | None"] = relationship( + "UserModel", + primaryjoin="foreign(UserModel.created_id) == remote(UserModel.id)", + uselist=False, + viewonly=True, + ) + updated_by: Mapped["UserModel | None"] = relationship( + "UserModel", + primaryjoin="foreign(UserModel.updated_id) == remote(UserModel.id)", + uselist=False, + viewonly=True, + ) + deleted_by: Mapped["UserModel | None"] = relationship( + "UserModel", + primaryjoin="foreign(UserModel.deleted_id) == remote(UserModel.id)", + uselist=False, + viewonly=True, + )