I’ve been using Django since 0.96 from time to time (greenfield development, support, consulting). Across projects I participated in, there is one bad tendency: developers define global per-model ordering via ordering meta option. They rely on this option everywhere: in tests (if there are any :), in code, in command-line scripts; then they change this meta option (say, customer changes requirements) and everything breaks, because order is different now. There are even blog posts that encourage developers to add this global option because “we are lazy” and “abstractions leak”.
Currently I support Django project that uses only 3 of Django’s apps (
messages)—the rest is project’s own apps. As you can see, project does not use admin, and, as there are only two (legacy) apps among project’s own ones where
ordering meta option is still set and matters (in all other places ordering is set explicitly via
order_by method of
QuerySet instances), it helped me completely remove definition of
Meta class from most of
models.py. In some places, though,
index_together option is set.
So far, such approach works pretty well. There is no implicit
ORDER BY in new code, so it is more readable and much easier to maintain.
Also project’s code does not use Django’s CBVs. It did use them, but, at the end of the day, they were completely project’s own, so removal of not-so-necessary middle level helped with debugging (and it made code way more readable :)
In addition to this, there are no definitions of
__unicode__ method of models anywhere. As it turned out, developers often want different and highly specific output in Python shell, therefore “default” model representation definition is just pointless.
This blog is about things I encounter while doing web and non-web software development.