Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from sqlalchemy import create_engine
- from sqlalchemy.orm import sessionmaker, relationship
- from sqlalchemy.ext.declarative import declarative_base, declared_attr
- from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
- from sqlalchemy import Column, Integer, ForeignKey, String
- sa_engine = create_engine("sqlite:///:memory:")
- Session = sessionmaker(bind=sa_engine)
- s = Session()
- class Base(object):
- @declared_attr
- def __tablename__(cls):
- return cls.__name__.lower()
- id = Column(Integer, primary_key=True)
- Base = declarative_base(cls=Base)
- class Order(Base):
- number = Column(String(5))
- class Invoice(Base):
- number = Column(String(5))
- class Payable(Base):
- type = Column(String(50))
- order_id = Column(Integer, ForeignKey('order.id'))
- order = relationship(Order)
- invoice_id = Column(Integer, ForeignKey('invoice.id'))
- invoice = relationship(Invoice)
- def __init__(self, val, str_type):
- self.type = str_type.lower()
- setattr(self, self.type, val)
- def __repr__(self):
- return 'Type:{}'.format(self.type)
- @hybrid_property
- def value(self):
- return getattr(self, self.type)
- Base.metadata.create_all(sa_engine)
- order = Order()
- invoice = Invoice()
- invoice.number = '00001'
- pbl1 = Payable(invoice, 'Invoice')
- pbl2 = Payable(order, 'Order')
- s.add(invoice)
- s.add(order)
- s.add(pbl1)
- s.add(pbl2)
- s.commit()
- print(pbl1.value.number) #this works
- res = s.query(Payable).filter(Payable.type=='order').all() #this works
- res = s.query(Payable).filter(Payable.order==order).all() #this works too
- res = s.query(Payable).filter(Payable.value==order).all() #this does not
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement