Hi all,
It has been only a while since I've started tinkering with SQLAlchemy. I aws working on a particular requirement of mine, where I had 4 types of users with login functionality. But each type has different attributes.
The user types are : Client, Brand, Merchant, Customer. All these types were supposed to have login access to the system. I created a parent model called User and other models like Client, Brand, Merchant and Customer inherits from the User model. I implemented it using joined table inheritance as per the documentation.
============================================================
# User Model
class User(UserMixin, BaseModel):
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True, unique=True)
email = Column(String, unique=True, nullable=False, index=True)
confirmed = Column(Boolean, default=False, nullable=False)
role = Column(Enum(Role))
__mapper_args__ = {
"polymorphic_on": role,
}
=============================================================
# Client Model
class Client(User):
__tablename__ = "clients"
id = Column(Integer, ForeignKey("
users.id"), primary_key=True)
__mapper_args__ = {
"polymorphic_identity": "client",
'inherit_condition': (id == User.id)
}
client_data = (...)
.....
================================================================
# Brand Model
class Brand(User):
__tablename__ = "brands"
id = Column(Integer, ForeignKey("
users.id"), primary_key=True)
__mapper_args__ = {
"polymorphic_identity": "brand",
'inherit_condition': id == User.id
}
brand_data = (...)
.....
Then I created an User object, which is to serve as the admin user. It works fine and well.
But the problem is when I'm creating other user types. For eg: when I'm creating a Client object, a row is created in the Client table as well as the User table. I am able to login with the client user. But the problem is when I'm trying to access the Client object's attributes. And the object type returned while querying the Client is of type User.
>>> from src.models.models import User
>>> User.get_all()
[<User 63: xxxxxxx>, <User 7: xxxxxxx>, <User 67: xxxxxxxx>, <User 13: xxxxxxxx>, <User 69: xxxxxxxxx>, <User 72: xxxxxxxx>]
>>> from src.models.models import Client
>>>
>>> Client.get_all()
[<User 7: xxxxxx>, <User 67: xxxxxxx>, <User 69: xxxxxx>]
>>>
But if I'm making the query on Client object before loading the User, it returns fine.
>>> from src.models.models import Client
>>> Client.get_all()
[<Client xxxxx>, <Client xxxxxxx>, <Client xxxxxx>]
>>>
I feel like I'm missing out on something?