On Feb 19, 2011, at 12:45 PM, Martijn Moeling wrote:
> 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
columns.contains_column(c)
>
>
> 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.
i don't understand what "sometimes" means. BaseClass.__table__.columns is a
collection created only once.
>
> 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
i dunno, [c for c in self.__table__.columns] + [c for c in
BaseClass.__table__.columns if c.key not in self.__table__.columns] ?
>
>
> 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.
--
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.