| 1 | Inspired by [http://www.hackdiary.com/archives/000093.html this nice hack by Matt Biddulph] I set up to create a similar thing for Django models. Below is an initial implementation, and here are some results generated with the OS X version of Graphviz: |
| 2 | |
| 3 | * [http://cavedoni.com/2006/08/camera.dot generated dot file]: resulting image in [http://cavedoni.com/2006/08/camera.pdf PDF] |
| 4 | * [http://cavedoni.com/2006/08/mincer.dot generated dot file]: resulting image in [http://cavedoni.com/2006/08/mincer.pdf PDF] |
| 5 | |
| 6 | I hope people might find it useful. |
| 7 | |
| 8 | {{{ |
| 9 | #!python |
| 10 | """Django model to DOT (Graphviz) converter |
| 11 | by Antonio Cavedoni <antonio@cavedoni.org> |
| 12 | |
| 13 | Make sure your DJANGO_SETTINGS_MODULE is set to your project and call |
| 14 | the script like this: |
| 15 | |
| 16 | $ python modelviz.py <appname>.<models module_name> > <filename>.dot |
| 17 | |
| 18 | Example: |
| 19 | |
| 20 | $ python modelviz.py camera.models > foo.dot |
| 21 | """ |
| 22 | |
| 23 | from django.db.models.base import ModelBase |
| 24 | from django.db.models.fields.related import \ |
| 25 | ForeignKey, OneToOneField, ManyToManyField |
| 26 | |
| 27 | def generate_dot(model_module): |
| 28 | print "digraph model {" |
| 29 | |
| 30 | for obj in dir(model_module): |
| 31 | o = getattr(model_module, obj) |
| 32 | if isinstance(o, ModelBase): |
| 33 | for field in o._meta.fields: |
| 34 | if type(field) in [ForeignKey, OneToOneField, ManyToManyField]: |
| 35 | print ' %s -> %s_%s [label="%s"];' % \ |
| 36 | (o.__name__, o.__name__, field.name, type(field).__name__) |
| 37 | print " %s_%s -> %s" % \ |
| 38 | (o.__name__, field.name, field.rel.to.__name__) |
| 39 | else: |
| 40 | print " %s -> %s_%s;" % (o.__name__, o.__name__, field.name) |
| 41 | |
| 42 | print "}" |
| 43 | |
| 44 | if __name__ == "__main__": |
| 45 | import sys |
| 46 | _models = __import__(sys.argv[1]) |
| 47 | generate_dot(_models.models) |
| 48 | }}} |