23 Aug 2026
Django community aggregator: Community blog posts
When Python is Too Slow

Python is a perfect language for Agile development, where requirements might change on the go. Especially if you are in a startup business, you will need to experiment and change things fast. However, Python is an interpreted language, and in certain situations you might need faster performance than what an interpreted language can provide. A common practice in these cases is using python-to-binary bindings, where the binary code is built with Rust, C++, or Go. In this article, I will explore bindings to Rust-based code.
How do the bindings work
The idea behind bindings is that you create a module with functions of a specific domain in a language that compiles to binary, and build it as a C-compatible dynamic library (.so on Linux, .dylib on macOS, .dll on Windows). Then a Python wrapper is built as a Python package and installed together with the dynamic library, allowing you to import and use functions that pass control to the corresponding functions in the dynamic library. On some occasions, classes can be used instead of functions. If any parameters are complex, they must be serialized in the wrapper and passed to the dynamic library as a JSON string or as a set of individual primitive parameters.
An experiment with benchmarks
To try this Python-Rust communication, I vibe coded an experiment that reads a large CSV file and builds a new one with duplicates stripped out based on specified column indexes. In my test case, it was a 3 MB CSV file with data about European NGOs for the donation platform I am building, where I wanted to remove the NGOs that don't have website URLs listed. As benchmarked, the file was processed 4.3x faster with the Rust binding than directly with Python.
Here is the repo to get a first glimpse into the code and structure.
What is there to know about Rust
A few things about Rust: Rust packages are built with Cargo, which is the equivalent of pip, virtualenv, and setuptools combined. A single package is called a crate, and it can be published to crates.io, the equivalent of PyPI. To create a Python-to-Rust binding, the standard approach is to use Rust's PyO3 library together with maturin, a build tool installable as a PyPI package.
Rust syntax is not the most developer-friendly compared to Python or Go, but with today's AI agents, most Python-native code can be ported to it fairly easily. The good thing about Rust and Go compared to C++ is that you don't have to manage memory at a low level or work with pointers directly.
The package structure
The common file structure can be:
thepackage_rs/ # the package - self-contained and installable
├── Cargo.toml # crate manifest (pyo3, etc.)
├── pyproject.toml # maturin build backend config
├── src/lib.rs # Rust implementation
└── python/
└── thepackage_rs/
└── __init__.py # Python wrapper
Once the code is ready, you build it with:
(.venv) maturin develop --release
This builds the Python package and installs it into the current virtual environment. You can also get the wheel at thepackage_rs/target/*.whl, built for your specific operating system.
Rust in Django
When developing Django websites, the biggest bottlenecks are usually not in the language itself, but in the connections to databases, file systems or object storage, and APIs. Still, in cases where you need to process large amounts of data or do heavier calculations, using a binary instead of Python makes sense. The orjson library, and DRF renderers built on top of it such as django-orjson or drf-orjson-renderer, are good examples of this - Rust boosts the speed of building or parsing JSON 2-10x compared to a Python-native implementation. The best places to use Rust replacements are background tasks, management commands, template parsing (see the experimental django-rusty-templates), and occasionally views or middleware.
Final words
So Python itself is good enough, especially when it comes to code readability and speed of development. However, when needed, certain parts can be improved 2 to 10x just by rewriting them as Python-Rust bindings. Just keep in mind that when it comes to views with data from the database or Elasticsearch, post-processing - such as reordering in Python or Rust - is an antipattern; do that directly in the queries instead. Finally, keep in mind, that building with Rust will need extra dependencies and maintainance in your workflows.
Cover photo by Alex Tepetidis
23 Aug 2026 5:00pm GMT
21 Aug 2026
Django community aggregator: Community blog posts
Fuzzy String Matching in Django and PostgreSQL
Gerald Carlton and I will be presenting on fuzzy name search at DjangoCon US 2026 on Monday, August 24, and this is the companion blog post. Searching for a person by name is harder than it looks: names might be typed differently by different operators or change over a person's lifetime; for example, Smith could be entered as Smyth, Smythe, or Smidt, and Weiss as Weiß. Although names are particularly susceptible to misspelling, these strategies apply to all fuzzy string matching.
21 Aug 2026 6:00pm GMT
Issue 351: DjangoCon US last call, Djangonaut Space applications open
We'll see you in Chicago! Jeff and Will are heading to DjangoCon US next week, so if you're going too, come say hi.
News
Almost Time: What to Know Before You Head to Chicago
DjangoCon US 2026 kicks off Monday, August 24 in Chicago, with registration and breakfast starting at 7:30 AM on the 14th floor. Watch for Friday's attendee email with your Slack invite and lightning-talk sign-up, and if you're sticking around for sprints on August 27-28, grab a free sprints ticket now.
New One-Day and Online Tickets
Can't make the whole week? DjangoCon US 2026 added one-day in-person tickets that also include online access to every other session, plus online-only tickets for remote attendees.
DSF Membership Open Space at DjangoCon US
Bring your questions about the Foundation to DSF board directors on Wednesday, August 26, 1:00 to 1:45 PM in the Wolf Point Ballroom.
Djangonaut Space News
Session 7 is preparing to take flight 💫
Session 7 runs October 12 through December 6, with teams of three or four Djangonauts guided by a Navigator and a Captain, working on Django Core, django CMS, Django Debug Toolbar, the Django Girls+ website, BeeWare, and Render Engine. Plan on about five hours a week, and note that past sessions have accepted roughly 10% of applicants, so fill out every section. Applications close September 6, 2026, Anywhere on Earth.
Updates to Django
Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! 🚀
Last week we had 13 pull requests merged into Django by 6 different contributors - including 2 first-time contributors! Congratulations to Karan Suthar and Jens Spanier for having their first commits merged into Django - welcome on board!
News in Django 6.1:
fetch_mode=Noneis added to the signature offrom_db().- It's fixed a regression where the deprecation of double-dot variable lookups incorrectly applied to string and translated template literals containing two consecutive dots, such as
a..b(#37257). - Fixed a regression where
ModelAdmin.list_displayentries that traverse multiple relations using __ could crash or display incorrect values (#37270). - Fixed a regression that caused
AlterFieldoperations that changed only the Python-levelon_deleteoption ofForeignKeyorOneToOneFieldfields to perform unnecessary schema changes (#37260).
Django Fellow Reports
Django Fellow Report - Jacob
Jacob Tyler Walls spent the week sweeping up after the 6.1 release, triaging admin changelist search crashes on __exact lookups, a Model.from_db() override crash, and unnecessary DDL when only a Python-level on_delete changes. He also accepted tickets for calver support in django.utils.version and for updating the release process docs under DEP 20, while GIS, caching, and the GSoC multi-column subquery work continued.
Django Fellow Report - Sarah
Sarah Boyce worked through Django 6.1 release blockers: an admin crash when ModelAdmin.get_action() is overridden with its pre-6.1 signature, values() querysets crashing on models with Meta.ordering, DecimalField without precision on SQLite, and second-degree relations in ModelAdmin.list_display looking up values on the wrong model. She also documented the YYYY[.N] versioning scheme and updated the download page for the newly approved annual release cycle.
Sponsored
Simple APM dashboards for Python. Set up in just 5 minutes
Drowning in data? Honeybadger gives you Just Enough APM™ without enterprise bloat or cost.
Our dev-friendly APM dashboards expose metrics and trends across your apps and infrastructure, so you can find and fix Python issues before users notice!
Articles
Nifty Django Feature: Counting on Multiple Columns
Count only counts one column at a time, so counting unique pet-and-vet pairs returns either every appointment or every distinct vet, never the answer you wanted. The fix is a small Subquery subclass whose template wraps values("pet", "vet").distinct() in a SELECT COUNT(*), which is a nice demonstration of how far Django's expression system bends.
django-upgrade 1.32.0 out now, with 44 AI-assisted bug fixes
Adam Johnson turned Claude loose on django-upgrade with the prompt "Find and fix bugs" and shipped 44 fixes across two rounds. The catches include url() to path() conversions that mangled regexes with literal angle brackets or unescaped dots, a five-year-old fixer that rewrote calls to html.escape() when it meant html.unescape(), and a multi_db = False mapping that produced an empty database list and blocked every query in a test.
Nearly 20 years of choosing Django
Lincoln Loop has attended or sponsored most DjangoCons since the first one in California in 2008, where founder Peter Baumgartner gave an early lightning talk. The team credits the conference with teaching them how to work a booth, order swag people actually wear, talk to strangers, and, for several of them, get over a fear of public speaking.
Docker Compose reads .env files by default
Compose reads the .env file in the directory you run it from and honors any COMPOSE_* variables it finds there, which is easy to miss if you think of .env as something that only reaches your containers. Frank Wiles uses it to set COMPOSE_FILE=compose.yml:overlay-compose.yml per directory, so a worktree can remap ports and add labels without touching the shared compose file.
Events
Start DjangoCon US at the Welcome Reception
Kick off the conference Sunday, August 23, 7-9 PM in the 15th Floor Lobby, with casual conversation and drinks courtesy of REVSYS, Two Rock Software, and Caktus Group.
Sign up for Travel Safety Checks & Chicago Travel Safety Updates
Traveling to Chicago from out of town or abroad? Sign up for the optional Travel Safety Check so someone can check in with you by WhatsApp or Signal once you've arrived.
Introducing Open Spaces! (And Why You Should Host One)
Pitch a topic on a sticky note and host your own participant-led discussion during Monday and Tuesday's Open Spaces sessions in the Wolf Point Ballroom.
DjangoCon US
Join us in Chicago or ONLINE! August 24-26 for the main conference, followed by two days of sprints. Online and one day tickets also available.
Videos
Interview with Django Expert Paolo Melchiorre on AI and Open Source
DSF Board Member Paolo Melchiorre talks about Django, AI-assisted development, open-source maintainership, and how the Python community is adapting to AI.
Why AI Coding Agents Fail on Real Codebases - Sheena O'Connell on Spec-Driven Development
PSF director and Django developer Sheena O'Connell sat down at PyCon US to discuss spec-driven development, AI agents, and why so many teams struggle to make agentic coding work in practice.
Django Job Board
Full Stack Software Engineer (Hybrid) at Provision
Toronto-based construction-AI startup building full-stack product surfaces and AI-forward document-processing systems.
Executive Director at Django Software Foundation
Remote US role running the DSF's fundraising, operations, and public representation as its first Executive Director.
Security Developer at Python Software Foundation
Global remote role triaging CPython/PyPI vulnerabilities and remediating supply-chain attacks alongside the Python Security Response Team.
Senior Full Stack Engineer at Hive Collective
US-only remote, backend-leaning full-stack role at a profitable LegalTech SaaS with an AI-assisted workflow.
Senior Backend Engineer at MyOme
Remote US backend role building portal integrations for patients and providers ordering genetic testing.
Python + TypeScript Engineers at Fusionbox
Remote US consultancy role building Django/React systems for financial workflows and multi-tenant architectures.
Projects
alzeph/django-forge-log
A lightweight, automatic audit trail - Who, What, When, Where, and the before/after Diff - for Django views (FBV, CBV, DRF ViewSets) and the Admin, stored in a single central JSON table.
tim-schilling/django-salmon
Does the monkey-patching of Django's internals once, then exposes a standardized set of signals so APM and observability tools do not each have to reinvent it. Receivers get args, result, timing, and a lazy stacktrace, and the decorator stack per facet is configurable.
21 Aug 2026 3:00pm GMT

