Hi, I'm trying to call the base class attributes from a declared_attr 
definition.

Something like:

class Edible(Base):
    __tablename__ = 'edible'
    brand = Column(String(20), primary_key=True)
    edible_type = Column(String(20), primary_key=True)
    __mapper_args__ = {'polymorphic_on': edible_type}
    def __repr__(self):
        return "<{}(brand={}, edible_type={})>".format(
                self.__class__.__name__, self.brand, self.edible_type)


class IceCream(Edible):
    __tablename__ = 'icecream'
    brand = Column(String(20), ForeignKey(Edible.brand), primary_key=True)
    cooling_recipe = Column(Text)
    @declared_attr
    def __mapper_args__(cls):
        return {
            'polymorphic_identity': 'icecream',
            'inherit_condition': (super(IceCream, cls).edible_type
                                  == 'icecream'),
            'inherit_foreign_keys': [super(IceCream, cls).edible_type]}

but I'm getting nameerrors.

Traceback (most recent call last):
  File "super.py", line 17, in <module>
    class IceCream(Edible):
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py", 
line 1165, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py", 
line 924, in _as_declarative
    mapper_args = cls.__mapper_args__
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py", 
line 1370, in __get__
    return desc.fget(cls)
  File "super.py", line 25, in __mapper_args__
    'inherit_condition': (super(IceCream, cls).edible_type
NameError: global name 'IceCream' is not defined

Using super(cls, cls) or Edible instead of super(IceCream, cls) works. But 
that doesn't sound right, does it??

How do I do this properly?

Full code attached.

-- 
Fayaz Yusuf Khan
Cloud developer and designer
Dexetra SS, Kochi, India
fayaz.yusuf.khan_AT_gmail_DOT_com
fayaz_AT_dexetra_DOT_com
+91-9746-830-823
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base, declared_attr

Base = declarative_base()


class Edible(Base):
    __tablename__ = 'edible'
    brand = Column(String(20), primary_key=True)
    edible_type = Column(String(20), primary_key=True)
    __mapper_args__ = {'polymorphic_on': edible_type}
    def __repr__(self):
        return "<{}(brand={}, edible_type={})>".format(
                self.__class__.__name__, self.brand, self.edible_type)


class IceCream(Edible):
    __tablename__ = 'icecream'
    brand = Column(String(20), ForeignKey(Edible.brand), primary_key=True)
    cooling_recipe = Column(Text)
    @declared_attr
    def __mapper_args__(cls):
        return {
            'polymorphic_identity': 'icecream',
            'inherit_condition': (super(IceCream, cls).edible_type
                                  == 'icecream'),
            'inherit_foreign_keys': [super(IceCream, cls).edible_type]}

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to