<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm" -->

---
title: Some more things about Django I've been enjoying | daily.dev
description: A developer shares their experience learning Django for building traditional server-rendered websites. Highlights include Django's QuerySet API for composable...
canonical: https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Some more things about Django I've been enjoying | daily.dev
og:description: A developer shares their experience learning Django for building traditional server-rendered websites. Highlights include Django's QuerySet API for composable...
og:url: https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm
og:image: https://api.daily.dev/og/posts/Hfugmu3Xm.png
og:image:alt: Some more things about Django I've been enjoying
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Some more things about Django I've been enjoying

**[Julia Evans](https://daily.dev/sources/jvns)** · 8 min read · 9 upvotes · 0 comments

## Summary

A developer shares their experience learning Django for building traditional server-rendered websites. Highlights include Django's QuerySet API for composable query builders, built-in template filters (especially the querystring tag), and automatic database migrations. Also covers a preference for function-based views over class-based inheritance, and open questions around Django performance — including LLM scraper traffic, template caching misconfiguration, and uncertainty about scaling strategies for a ~$10/month VM serving 2-3 requests per second.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://jvns.ca/blog/2026/07/21/more-nice-django-things>

## Community take

How the wider developer community reacted, aggregated from 2 discussions and 131 comments across hackernews (as of 2026-07-27).

**TL;DR:** The community is broadly positive about Django's ORM and migration system, but raises pointed concerns about the double-underscore filter syntax, async Python footguns, Django app structure at scale, and the article's misleadingly low benchmark numbers (which commenters attribute to misconfigured tooling rather than Django itself).

**Sentiment:** 35% positive · 40% mixed · 25% skeptical

**The case for**

- Django's ORM and migration system are widely praised as unmatched, with some using it purely for DB management even in Go/Java stacks.
- Using Django just for models, migrations, and the admin interface behind other language stacks (Go, Rust) is called a 'hidden superpower'.
- Synchronous Django is easy to operate in production when deployed correctly (nginx → gunicorn, static assets offloaded).
- Django's double-underscore filter syntax has a practical advantage: it maps directly to URL query strings for ad-hoc admin queries.

**The pushback**

- The double-underscore filter syntax feels inconsistent with Python idioms; SQLAlchemy and other ORMs use operator overloading instead.
- Django's default template language has arbitrary restrictions (no brackets in boolean expressions, no arithmetic, no variable assignment) that force awkward workarounds.
- Django 'apps' as a structural pattern become an antipattern in large monoliths, leading to thousands of unsquashable migrations with cyclic cross-app dependencies.
- Async Python (asyncio) has numerous footguns: accidental event-loop blocking, unbounded queues, task garbage collection, and cancellation bugs that are hard to detect before production.
- The article's benchmark of 2–12 RPS is misleading — commenters say it reflects a misconfigured dev server or single-concurrency test (-c 1), not Django's actual throughput.

**By community**

- hackernews (mixed): Enthusiastic about Django's ORM/migrations and its use as a DB toolkit, but critical of the filter DSL, template limitations, multi-app structure pitfalls, async Python dangers, and the article's unrepresentative benchmarks.

**Hottest debate:** Whether Django's double-underscore filter syntax is a reasonable design or an inconsistent hack compared to operator-overloading ORMs like SQLAlchemy.

**Open questions**

- What is the correct production setup (gunicorn workers, nginx, SQLite PRAGMAs) to get representative Django throughput numbers?
- Is there a clean way to use Django migrations without splitting into multiple apps to avoid cross-app FK migration complexity?
- Would Python's type system now enable a lambda-predicate filtering API with IDE autocomplete similar to .NET/Scala?

**Highlights**

> There are so many footguns[1] in async python but it really has stolen the zeitgeist of modern python web. Synchronous django has a lot to commend it. If you deploy it reasonably well (workers, behind a caching reverse proxy etc) it's easy to operate in production even under duress. It's not going to be the right stack for long lived websocket connections or whatever but for a CRUD-ish or enterprise app, often very productive. [1] buffer bloat is too easy to sleep walk into     queue = asyncio.Queue()  # oops unbounded concurrency     await asyncio.gather(*(fetch(item) for item in items))  # look mum! no outbound sockets left or maybe even no file descriptors accidental blocking     data = requests.get(url).json()  # oops! we're blocking the event loop and sure you can setup a separate task to measure the event loop latency and alert on that but this is the kinda thing you'll never find in a tutorial, you just need to experience this stuff and figure out a solution you like I can go on and on about async python (cancellation bugs, leaking a task - that has a cataclysmic failure mode where if you forget to hold a reference to your asyncio.create_task() then it's all weak refs in that machinery so your task can get garbage collected before it ran or completed in production! super tricky forensics. Then there's all the obvious stuff like race conditions, new ways of creating deadlocks, blah blah i really can go on for days.
> — [CraigJPerry on hackernews · 6 comments](https://news.ycombinator.com/item?id=49056394)

> I have been using Django since 0.95 and I haven't seen anything which is so flexible with amazing DSLs while also making it easy to understand the magic behind it. For the last 10 years, even in a Golang stack or Java stack, I still use Django for models and migration. I even have generators which generate Gorm (or other framework) DAO or Java hibernate classes using Django models. With LLMs, it becomes easier since I can now write all the model, custom querysets in Django, ask the LLM to generate Golang DAO, setters and getters... and test the query against the Django generated queries for completeness. Atlas, sqlx, sqlc and all other ORM like things in golang cannot do migrations the way Django does.
> — [ranedk on hackernews · 2 comments](https://news.ycombinator.com/item?id=49055979)

> > I still use Django for models and migration There are dozens of us! It's a great db management toolkit. I've used it to much success many times for things like managing migrations from mysql to postgres and php to python. My opinions: - Django apps are an anitipattern for large internal / single purpose products due to migration overhead as FKs cross application boundaries. I will die on this hill. No team is ever disciplined enough to keep apps as boundaries for relationships and constraints. Strong contrast to the rails crowd that doesn't rely on referential integrity in the db by default where this isn't "a thing". - Goose[0] migrations in Go are really great but you have to let go of the dsl and the idea that your ORM drives your migrations, as you explicitly called out. Laravel[1] is on par with django IMO and a delight to use when in php-land. I've not tried to repurpose it like I have with Django and sqlalchemy. - sqlalchemy and alembic is a great toolchain outside of django that get's a bit of a bad wrap / confusion from django devs. it gives you that same ability to drive the changes from the classes / structs without having to drag around all of django. It having more verbose [0] https://github.com/pressly/goose [1] https://laravel.com/docs/13.x/migrations
> — [leetrout on hackernews · 2 comments](https://news.ycombinator.com/item?id=49058346)

> For Django's default template language, does it still have these limitations? 1. Brackets aren't allowed to help with boolean expressions like {% if a and (b or c) %} 2. You can't do basic arithmetic like {{ x * 2 }}, but you're allowed to do {{ x | add:"2" }}. There's hacks to multiply using {% widthratio a 1 b %} or division with {% widthratio a b 1 %}  though (https://stackoverflow.com/questions/18350630/multiplication-...). 3. You can't assign expressions to variables like {% with x = a or b %}, so you have to repeat yourself. 4. You can't capture HTML generated from template code in a variable to pass into a partial template to write slots-style HTML components e.g. {% capture x %}Hello {{ username }}{% endcapture %}{{ include "partials/header.html" with body_html=x }}. 5. You can't pass variables to model methods. I understand there's a philosophy that templates shouldn't contain complex logic, but I find the above pretty arbitrary (addition is okay but not multiplication? boolean logic is okay but not with brackets?) and leads to code that's harder to maintain. I often have to puzzle out some way to get my code to work that goes against what I'd normally want to do, like duplicating code in the template because you can't put expressions in variables or being forced to move basic one-off logic into views (which has poor locality https://htmx.org/essays/locality-of-behaviour/ and makes it harder to move template snippets between pages). Is Jinja2 a practical alternative or there's friction to using it?
> — [seanwilson on hackernews · 3 comments](https://news.ycombinator.com/item?id=49057556)

> SQLalchemy does that. One advantage of the Django syntax is that it can be (pretty much) directly dropped into a query string on any admin page or DRF query and filter the results. E.g. the admin page for all the events after noon today:   admin/event/?end__gt=2026-07-26T12:00:00 Being able to do ad-hoc queries using the same paradigm your app queries are written in, and then pass urls around with those queries included (e.g., quick one-off reports or answers to client questions) is so helpful.
> — [mmclar on hackernews](https://news.ycombinator.com/item?id=49063180)

**Source threads**

- [hackernews](https://news.ycombinator.com/item?id=48997828) · 70 points · 127 comments
- [hackernews](https://news.ycombinator.com/item?id=49006691) · 11 points · 4 comments

## Similar posts on daily.dev

- [What I love about Django](https://daily.dev/posts/what-i-love-about-django-7gnjuqa7b) · Hacker News · 2 upvotes · 0 comments
- [Some notes on starting to use Django](https://daily.dev/posts/some-notes-on-starting-to-use-django-piqautomn) · Julia Evans · 0 upvotes · 0 comments
- [Django Quiz 2025](https://daily.dev/posts/django-quiz-2025-uwduv0wai) · Adam Johnson · 0 upvotes · 0 comments
- [Django tutorial: Get started with Django 6](https://daily.dev/posts/django-tutorial-get-started-with-django-6-h05qphcbb) · InfoWorld · 1 upvotes · 0 comments

---

Tags: [#webdev](https://daily.dev/tags/webdev), [#python](https://daily.dev/tags/python), [#database](https://daily.dev/tags/database), [#django](https://daily.dev/tags/django)

[View this post on daily.dev](https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Some more things about Django I've been enjoying","url":"https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm"},"datePublished":"2026-07-21T20:36:13.237Z","dateModified":"2026-07-27T07:03:59.417Z","description":"A developer shares their experience learning Django for building traditional server-rendered websites. Highlights include Django's QuerySet API for composable...","image":"https://media.daily.dev/image/upload/s--VDukGCjf--/f_auto/v1722860399/public/Placeholder%2002","thumbnailUrl":"https://media.daily.dev/image/upload/s--VDukGCjf--/f_auto/v1722860399/public/Placeholder%2002","isAccessibleForFree":true,"articleSection":"Julia Evans","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Julia Evans","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/ca70ca2927f3438d829d4a10e91e3c36","url":"https://daily.dev/sources/jvns"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/some-more-things-about-django-i-ve-been-enjoying-hfugmu3xm","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":9},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"webdev,python,database,django","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Julia Evans","item":"https://daily.dev/sources/jvns"},{"@type":"ListItem","position":3,"name":"Some more things about Django I've been enjoying"}]}
```

