using type() is equivalent to using a class declaration. The end result is
the same, as are the mechanics of what goes on both from a Python as well as a
SQLAlchemy perspective. So this works:
Positive = type("Positive", (Base,), dict(__tablename__ =
"positives", value = Column(Integer)))
@event.listens_for(Positive.value, "set")
def checkvalue(target, value, oldvalue, initiator)
assert value > 0
and also, since type() is equivalent to a class declaration, you can still use
@validates, if you pass the function into the class dictionary, so that it is
part of the class before declarative sends it off to mapper():
@validates("value")
def checkvalue(self, name, value):
assert value > 0
return value
Positive = type("Positive", (Base,), dict(__tablename__ =
"positives", value = Column(Integer), checkvalue=checkvalue))
On Apr 15, 2012, at 12:37 PM, lars van gemerden wrote:
> I don't know what "@validates hangs a marker of the method that
> mapper() uses when it instruments the class" means. I guess my
> question now becomes: How do I add the event.listens_for descriptor to
> the class, since i do not have a class declaration in the traditional
> sense?
>
>
>
> On Apr 15, 4:29 pm, Michael Bayer <[email protected]> wrote:
>> @validates hangs a marker of the method that mapper() uses when it
>> instruments the class, so if the class is already mapped then that train has
>> left the station. Taking a cab instead, you can just add the attribute
>> event directly:
>>
>> @event.listens_for(Positive.value, "set")
>> def checkvalue(target, value, oldvalue, initiator)
>> assert value > 0
>>
>> if you want to return a new, mutated value then add retval=True to
>> listens_for().
>>
>> On Apr 15, 2012, at 8:22 AM, lars van gemerden wrote:
>>
>>
>>
>>
>>
>>
>>
>>> Hi,
>>
>>> I need a way to dynamically add a validates method to a already
>>> created sqla class.
>>
>>> In a normal class declaration you can add a validator by:
>>
>>> class Positive(Base):
>>> __tablename__ = "positives"
>>> value = Column(Integer)
>>
>>> def checkvalue(self, name, value):
>>> assert value > 0
>>> return value
>>> validates("value")(checkvalue)
>>
>>> However if you get the class dynamically:
>>
>>> Positive = type("Positive", (Base,), dict(__tablename__ =
>>> "positives", value = Column(Integer)))
>>
>>> I can't figure out how to add the validator, either in the type() call
>>> or afterwards.
>>
>>> Cheers, Lars
>>
>>> --
>>> 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
>>> athttp://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.
>
--
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.