Django and Postgres for the Busy Rails Developer
Project and models structure in Django
- Concern raised about the article implying all models live in a single
models.py; several posters say that’s only for small apps. - Common patterns: multiple apps each with their own
models.py, or amodels/package with one model per file and an__init__.py“barrel” that re-exports them. - Some see Django’s app vs project distinction as confusing; others simplify by putting everything in a single “core” app.
Django vs Rails: developer experience
- Multiple commenters strongly prefer Rails, citing:
- Better defaults, scaffolding, deployment story (Capistrano), and Hotwire/Turbo integration.
- More consistent project structure, making it easier to move between codebases.
- Others prefer Django/Python, emphasizing:
- Batteries-included approach, especially the built-in admin.
- Ability to swap components (templating engine, DB, management commands).
- Some argue big projects in any framework get messy; others insist language/framework choice heavily affects how long they stay manageable.
Templating and front-end approaches
- Django’s template language is heavily criticized as slow, restrictive, and dated; some want something closer to ERB/React or LiveView/Blazor.
- Others defend it as intentionally limited for safety and separation of concerns, while acknowledging it’s overkill for simple logic.
- Alternatives mentioned: Jinja2, Python-based HTML builders (htpy, htmy), React-based server-side rendering for Django, Hotwire/Stimulus with Django, PEP 750 proposals for “native” templating.
ORMs and querying
- Rails’ ActiveRecord is widely praised as the most natural and productive; several find Django ORM and SQLAlchemy more verbose or awkward.
- Counterpoint: many Python devs strongly like Django ORM; some call it a “work of art” and main reason to use Django.
- Debate over readability of Django’s double-underscore joins vs nested data structures, and over unit-of-work capabilities (SQLAlchemy praised; Django seen as per-object).
- Discussion of architectural patterns: ActiveRecord vs data mapper, domain logic entangled with persistence, N+1 query risk in Rails, and the value of keeping business logic separate from the ORM.
Migrations and schema management in Django
- Django migrations are a major pain point for some:
- Not-null-by-default plus Python-level
defaultvs SQLdb_defaultcan cause deployment-time crashes. on_deleteand some defaults enforced in Python rather than as DB constraints surprise people.- Auto-generated
AlterFieldSQL can be slow or dangerous (dropping/recreating constraints, undoing manual tweaks). makemigrationshistorically created noisy, no-op migrations (partly improved in newer versions).
- Not-null-by-default plus Python-level
- A few advocate hand-written SQL migrations only, or careful use of
RunSQLandSeparateDatabaseAndState.
Ecosystem, hiring, and language choice
- Python is seen as more broadly useful beyond web (ML/AI, data science), giving Django higher perceived ROI for some.
- Others argue framework learning dominates language learning; switching between Ruby and Python later isn’t hard.
- Several note it’s much easier to hire experienced Python devs than Ruby devs. Ruby is described as delightful but more “clever”; Python as “boring” but large and pragmatic.
Use cases and ecosystem strengths
- Django + GeoDjango + PostGIS + Python geospatial libs (GDAL, shapely, etc.) are praised as uniquely strong for GIS-heavy stacks.
- Django is also favored for internal tools and data-heavy apps where Python’s scientific ecosystem matters.
- Rails is preferred for fast-moving, customer-facing products needing rich interactivity (Hotwire, Turbo, strong scaffolding).
- Some dislike Django so much they recommend composing Flask/SQLAlchemy/Jinja2 instead; others who’ve inherited Flask systems trying to match Django’s “full stack” regret that choice.