I guess the simplest solutions are often the best… Turns out this actually 
works flawlessly (from what I’ve been able to tell so far), I didn’t expect 
SQLAlchemy to be smart enough to figure it out so I never even tried it this 
simple…

Thanks!

> On 23 Mar 2019, at 20:04, Mike Bayer <mike...@zzzcomputing.com> wrote:
> 
> On Sat, Mar 23, 2019 at 12:39 PM 02JanDal <j...@dalheimer.de 
> <mailto:j...@dalheimer.de>> wrote:
>> 
>> Hello,
>> 
>> I have two simple inheritance trees using joined table inheritance, see code 
>> below. In short, MembershipType inherits BaseShopItem and Membership 
>> inherits TransactionItem and there is a one-to-many relationship between 
>> BaseShopItem and TransactionItem.
>> 
>> This works well, but now I want to be able to get the membership type for a 
>> certain membership, as well as all memberships for a membership type. Since 
>> this information already is present (through TransactionItem.shop_item_id, 
>> thus between the parent classes) I do not want to introduce another foreign 
>> key between the subclasses. What is the most elegant way to represent this 
>> as a relationship?
> 
> Are you looking just to have Membership.transaction_items with the
> TransactionItem objects filtered out and vice versa ?   I think you
> can use relationship() directly, Membership.membership_types =
> relationship("MembershipType") / MembershipType.membership =
> relationship("Membership") .   You just need to be careful not to
> modify both levels of relationship at once so you'd probably make
> these viewonly.    Alternatively, just build accessor methods with
> @property that iterate Membership.transaction_items and filter out all
> objects that are are not a subclass of MembershipType.
> 
> 
>> 
>> I believe that composite secondary joins are most likely what I need, but do 
>> not fully understand it and have therefore not been able to adapt it.
>> 
>> I'm using SQLAlchemy 1.3.1 with both SQLite and Postgres.
>> 
>> Thanks for your time,
>> Jan Dalheimer
>> 
>> Code:
>> 
>> class BaseShopItem(db.Model):
>>    __tablename__ = 'shop_item'
>>    id = db.Column(db.Integer, primary_key=True)
>>    type = db.Column(db.String)
>> 
>>    transaction_item = db.relationship('TransactionItem', 
>> back_populates='transaction_items')
>> 
>>   __mapper_args__ = {
>>        'polymorphic_identity': 'shop_item',
>>        'polymorphic_on': type
>>    }
>> 
>> class MembershipType(ShopItem):
>>    __tablename__ = 'membership_type'
>>    id = db.Column(db.Integer, db.ForeignKey('shop_item.id'), 
>> primary_key=True)
>> 
>>   __mapper_args__ = {
>>        'polymorphic_identity': 'membership_type'
>>    }
>> 
>> class TransactionItem(db.Model):
>>    __tablename__ = 'transaction_item'
>>    id = db.Column(db.Integer, primary_key=True)
>>    type = db.Column(db.String)
>>    shop_item_id = db.Column(db.ForeignKey('shop_item.id'))
>> 
>>    shop_item = db.relationship('ShopItem', 
>> back_populates='transaction_items')
>> 
>>   __mapper_args__ = {
>>        'polymorphic_identity': 'transaction_item',
>>        'polymorphic_on': type
>>    }
>> 
>> class Membership(TransactionItem):
>>    __tablename__ = 'membership'
>>    id = db.Column(db.Integer, db.ForeignKey('shop_item.id'), 
>> primary_key=True)
>> 
>>   __mapper_args__ = {
>>        'polymorphic_identity': 'membership'
>>    }
>> 
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>> 
>> http://www.sqlalchemy.org/
>> 
>> 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+unsubscr...@googlegroups.com 
>> <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
>> To post to this group, send email to sqlalchemy@googlegroups.com 
>> <mailto:sqlalchemy@googlegroups.com>.
>> Visit this group at https://groups.google.com/group/sqlalchemy 
>> <https://groups.google.com/group/sqlalchemy>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
> 
> -- 
> SQLAlchemy - 
> The Python SQL Toolkit and Object Relational Mapper
> 
> http://www.sqlalchemy.org/ <http://www.sqlalchemy.org/>
> 
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example.  See  http://stackoverflow.com/help/mcve 
> <http://stackoverflow.com/help/mcve> for a full description.
> --- 
> You received this message because you are subscribed to a topic in the Google 
> Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit 
> https://groups.google.com/d/topic/sqlalchemy/uij20f53dMg/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

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+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to