Django: How to dynamically add tag field to third party apps without touching app's source code

Posted by Chris Lawlor on Stack Overflow See other posts from Stack Overflow or by Chris Lawlor
Published on 2010-03-14T16:14:10Z Indexed on 2010/03/14 22:35 UTC
Read the original article Hit count: 291

Filed under:
|
|
|
|

Scenario: large project with many third party apps. Want to add tagging to those apps without having to modify the apps' source.

My first thought was to first specify a list of models in settings.py (like ['appname.modelname',], and call django-tagging's register function on each of them. The register function adds a TagField and a custom manager to the specified model. The problem with that approach is that the function needs to run BEFORE the DB schema is generated.

I tried running the register function directly in settings.py, but I need django.db.models.get_model to get the actual model reference from only a string, and I can't seem to import that from settings.py - no matter what I try I get an ImportError. The tagging.register function imports OK however.

So I changed tactics and wrote a custom management command in an otherwise empty app. The problem there is that the only signal which hooks into syncdb is post_syncdb which is useless to me since it fires after the DB schema has been generated.

The only other approach I can think of at the moment is to generate and run a 'south' like database schema migration. This seems more like a hack than a solution.

This seems like it should be a pretty common need, but I haven't been able to find a clean solution.

So my question is: Is it possible to dynamically add fields to a model BEFORE the schema is generated, but more specifically, is it possible to add tagging to a third party model without editing it's source.

To clarify, I know it is possible to create and store Tags without having a TagField on the model, but there is a major flaw in that approach in that it is difficult to simultaneously create and tag a new model.

© Stack Overflow or respective owner

Related posts about django

Related posts about tagging