On Jun 25, 2011, at 10:59 PM, Arthur Kopatsy wrote:
> Hi,
>
> I have seen a few related questions but never a clear answer. I have a
> set of core models defined using a declarative form. These models are
> used by multiple applications.
>
> In each application we however want to extend this model class with
> helper methods. Since these methods are application specific, they
> cannot be define in the model itself.
>
> I have tries multiple ways with no success and all pretty gross in my
> opinion:
> 1. Subclass the original model, catch the SA load event and set
> __class__ to whatever I want.
> Problem: mapper was getting confused if the original model and the
> subclass had the same name.
> 2. Modify __bases__ and and my helper class to inject methods.
> Problem: it fails with model inheritance.
> 3. Monkey patch the module itself (models.MyModel = MyCustomModel).
> Problem: Mapper fails right away (class not mapped)
> 4. Monkey patching the class and add methods and attributes: best
> solution so far.
>
> What is the recommended way? I would love to be able to subclass the
> model and tell the mapper to use that new class instead...
If these applications run in different process spaces, and if you are able to
identify which application is running at module import time, you can achieve
this effect through careful organization of imports:
model/__init__.py
model/some_model.py
model/app1/__init__.py
model/app1/helpers.py
model/app2/__init__.py
model/app2/helpers.py
in model/__init__.py:
if app == 'app1':
from model.app1 import helpers
elif app == 'app2':
from model.app2 import helpers
in model/some_model.py:
from model import helpers
class SomeWidget(Base, helpers.Widget):
# declarations
class SomeFoober(Base, helpers.SomeFoober):
# declarations
This might not be too different from your "inject __bases__" approach. That
should also work, if you're having trouble with inheritance you need to inject
into __bases__ only at the appropriate points, checking each target class as to
whether or not it's already part of an inheritance hierarchy.
Another approach is to declare the model as mixins, then the individual
applications declare the actual "mapped" models using those mixins. This is
basically the same idea in the opposite direction. However that approach is
more appropriate if the model itself also varies among applications (I have an
app that does this). In this case it appears the variability is just on the
"some methods to be mixed in" side.
>
> Thank you
>
> Arthur
>
> --
> 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.