Hi,

I am running into something weird results I do not really understand. SA 0.6.6


I have a Polymorhic table setup, where I need to get the columnlist for 
outputting the ExtJs 4 Model.

Basically it should output    


( 'User' : { fields : [
                                {'field1' : 'int'},
                                {'field2' : 'string'},
                                {'field3' : 'boolean'}
                                ]
                }
) 


to output the data to the browser in json I do

dict(Userinstance)


to get this working I have added to the BaseClass of the polymorphic setup

    def __iter__(self):
        for c in self.__table__.columns  + BaseClass.__table__.columns:
            if c.name not in ['discriminator']:
                if isinstance(c.type, DateTime):
                    value = getattr(self, c.name).strftime("%Y-%m-%d %H:%M:%S")
                else:
                    value = getattr(self, c.name)
                yield(c.name, value)

This works fine but a few things has to be taken in consideration:

Both self.__table__.columns and BaseClass.__table__.columns__ have columns 
defined in the BaseClass
In the above, this is no real problem since the dict keys are overwritten and 
they have the same value anyway.

if I do the same for generating a model:

    def ExtModel(self):
        Result = {'fields': []}
        for c in self.__table__.columns + BaseClass.__table__.columns:
            if c.name not in ['discriminator']:
                if isinstance(c.type, Unicode):
                    Result['fields'].append({'name': c.name, 'type': 'string'})
                elif isinstance(c.type, Integer):
                    Result['fields'].append({'name': c.name, 'type': 'int'})
                elif isinstance(c.type, Boolean):
                    Result['fields'].append({'name': c.name, 'type': 'boolean'})
                elif isinstance(c.type, Float):
                    Result['fields'].append({'name': c.name, 'type': 'float'})
                elif isinstance(c.type, DateTime):
                    Result['fields'].append({'name': c.name, 'type': 'date'})
        return self.__class__.__name__, Result
 
I get the Id field twice..... in the fieldlist
again they have the same value, but here it alters the result.


I need something like:
    def ExtModel(self):
        ColumnList = self.__table__.columns
        for c in BaseClass.__table__.columns:
            if c not in self.__table__.columns:
                ColumnList.append(c)
        Result = {'fields': []}
        for c in self.__table__.columns + Affiliation.__table__.columns:
           ...... etc


which gives:
    if c not in self.__table__.columns:
  File 
"/Library/Python/2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/sql/expression.py",
 line 2064, in __contains__
    raise exc.ArgumentError("__contains__ requires a string argument")
sqlalchemy.exc.ArgumentError: __contains__ requires a string argument


One other thing i noted which is really odd....

I have multiple classes inheriting from BaseClass, which is why I have set up 
polymorphic inheritance in the foist place.

When I do:

alldata = s.query(BaseClass).all()
for a in alldata:
        print a.ExtModel()


I notice that BaseClass.__table__.columns sometimes holds the Id in others it 
doesnt.

most of the classes (new project) are "empty" anyway and are no more than:

SomeClass(BaseClass):
        Id      = Column(Integer, ForeignKey('baseclass.Id'), primary_key=True)

SomeClass2(BaseClass):
        Id      = Column(Integer, ForeignKey('baseclass.Id'), primary_key=True)

That is really weird!!!!!  It solves my problem automatically on some instances 
but not on others and only for the Id column .......



Is there a way I can make a new ColumnList based on the self.__table__.columns 
and BaseClass.__tablename__ excluding the overlap. In this example I 'only' 
talk about the Id but in my real world there are more Columns in BaseClass


Martijn













-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to