Personal website of Filipe Figueiredo Correia
What’s the relation between these two, you may ask. Django, and other frameworks of the sort, try to provide all that stuff that developers could otherwise need to implement over and over in their web applications. They allow to focus on what really differentiates our web apps from the rest of them. In part, this means letting developers focus on the domain model.
Django’s models do this well1, but they are more “relational” than they actually needed to be — we still have to deal with stuff like ForeignKeys and the like.
I would rather think exclusively in terms of objects, but, no ORM can fully abstract the relational database underneath. This is a leaky abstraction that half of the world would like to see fixed, and the other half as actually tried to fix it but failed to varying degrees. And that’s why I understand why django’s approach has converged to what it is today. It reflects a reasonable balance of these forces.
I still think there are better names than ForeignKey to represent one-to-many associations, though.
Even if not purely object-oriented in their nature, I still think of django models as object-oriented domain entities. And the domain model of a system can really grow beyond the point where it can fit in a single person’s mind. Django projects are no exception.
So, I’ve been trying to find a tool that helps me dealing with large django projects. Here are some of my findings:
The graphmodels extension is serving me good for now, after some hacking to make the generated diagrams closer to UML class diagrams. Here’s an example of how it looks for the pycon system source code:
Here’s how it looked before the modifications:
This example doesn’t have generalizations, which also look much nicer with my changes. Here’s an example of how they look using my patch, before and after respectively:
Update 2011/09/23: Fixed big mixup with the pictures.
You've reached the personal website of Filipe Correia. Software Engineer and Researcher with an inclination to agile methods, design patterns, architecture, collaborative systems and information science.