Child class attributes not loading up in joined inheritance model

21 views
Skip to first unread message

Shefeek Najeeb

unread,
Nov 8, 2021, 6:07:31 AM11/8/21
to sqlalchemy
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?

Mike Bayer

unread,
Nov 9, 2021, 8:56:52 AM11/9/21
to noreply-spamdigest via sqlalchemy
note we are following up w/ this question at discussions:  https://github.com/sqlalchemy/sqlalchemy/discussions/7303
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
 
 
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+...@googlegroups.com.

Shefeek Najeeb

unread,
Nov 10, 2021, 12:10:27 AM11/10/21
to sqlalchemy
Thanks. I'll follow up at discussions.
Reply all
Reply to author
Forward
0 new messages