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
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