I have a users
table and a roles
table, such that a User
optionally has a single Role
:
<code>class User(Base):
id: Mapped[int] = mapped_column(primary_key=True)
role: Mapped[Optional["Role"]] = relationship(back_populates="user")
# ...
class Role(Base):
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
user: Mapped[Optional["User"]] = relationship(back_populates="role")
# ...
</code>
<code>class User(Base):
id: Mapped[int] = mapped_column(primary_key=True)
role: Mapped[Optional["Role"]] = relationship(back_populates="user")
# ...
class Role(Base):
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
user: Mapped[Optional["User"]] = relationship(back_populates="role")
# ...
</code>
class User(Base):
id: Mapped[int] = mapped_column(primary_key=True)
role: Mapped[Optional["Role"]] = relationship(back_populates="user")
# ...
class Role(Base):
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
user: Mapped[Optional["User"]] = relationship(back_populates="role")
# ...
Now in code I would like that User.role
always return a Role
. If a specific User
doesn’t have a Role
, it should just return a new default one: Role()
.
How can I replace User.role
with some kind of getter function that does this?
A somewhat obvious solution would be:
<code>class User(Base):
# ...
@property
def role_or_new():
return self.role or Role()
</code>
<code>class User(Base):
# ...
@property
def role_or_new():
return self.role or Role()
</code>
class User(Base):
# ...
@property
def role_or_new():
return self.role or Role()
However, I kind of want to override the default attribute name, role
.
There are some similarly named existing questions, but I think they’re all subtly different:
- Flask-SQLAlchemy set relationship default value: solved through events
- How to set a default value for a relationship in SQLAlchemy?: Adds a new method, but I want to modify how the existing attribute
role
behaves - How to set a default value from a SQLAlchemy relationship?: Asks how to get default values based of an existing relationship