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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.