Model or dataset
deschler/django-modeltranslation avatar
deschler/django-modeltranslation

django-modeltranslation: Database-backed Django model translations

Translates Django models using a registration approach.

1,483 stars273 forksPythonBSD-3-Clause

At a glance

What is it?
django-modeltranslation adds language-specific fields to existing Django models through application registration. It suits projects that need translated database records and admin editing without editing the original model classes.
Who is it for?
Projects with multilingual Django content should consider django-modeltranslation when same-table storage, admin integration, and registration outside model classes are priorities. Projects that cannot change database tables or dependency versions should look elsewhere.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 12 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 7, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • deschler/django-modeltranslation1,483 ★ · -1
Star history
Repository2026-10-192026-11-07
deschler/django-modeltranslation1.5k1.5k

-1 Stars in the last 19 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Why django-modeltranslation avoids model edits

django-modeltranslation addresses a specific Django limitation: existing application models do not inherently provide separate fields for content stored in several languages. Its registration approach adds translation support outside the original model class, allowing the same application to be reused in projects that require translations and projects that do not.

The intended users are Django developers managing dynamic content such as records entered through the Django admin. A developer registers translatable fields rather than replacing the application model with translated variants. This separation also limits changes to the original project, which matters when the model belongs to a reusable application or its source cannot be edited.

The approach supports an arbitrary number of languages, according to the README. It can translate more than text fields, and it covers abstract models and multi-table inheritance. Those features make it relevant to content models with mixed field types or unusual inheritance layouts, although the README does not document the exact behavior for every supported field type.

This is not a replacement for translating interface strings. The project addresses translations of dynamic database content in Django models. It also is not a separate content service connected over an API, because its documented design stores translation fields in the model table and integrates with the Django admin.

Registration and same-table translation storage

The central design choice is a registration system comparable in structure to Django's admin application. A project opts a model into translation through configuration, then identifies the fields that need language-specific versions. The original model class does not have to be rewritten.

The README states that translation fields are stored in the same table as the original model data. That design removes the joins that a separately normalized translation table would introduce for ordinary record reads. It also means adding translation support includes a database schema change even though the Python model declaration remains untouched. A team evaluating the package must account for migrations and existing rows, neither of which is described in the README.

Django admin integration exposes this storage through the project's existing admin environment. The README describes flexible fallbacks and automatic population as additional features, but it does not provide the configuration keys, fallback sequence, population conditions, or an admin example in the excerpt. Those details must be checked in the linked external documentation before choosing behavior for missing translations.

Based on the repository layout, the package is an importable Django application under `modeltranslation/`, with documentation in `docs/`, tests and settings under `modeltranslation/tests/`, and package metadata in `pyproject.toml`. The package also includes typing support through `typing-extensions`, while Django provides the web and ORM framework around it.

Dependencies and first-use documentation boundary

The package metadata gives a concrete compatibility target rather than leaving installation requirements implicit. Python 3.10 through Python 3.14 are declared, with the project requiring Python 3.10 or newer below version 4. Django 5.1 or newer is a runtime dependency, and `typing-extensions` 4.0.1 or newer is also required.

The README does not contain installation commands, an `INSTALLED_APPS` example, model registration code, or migration commands. It directs readers to the current documentation at `https://django-modeltranslation.readthedocs.io/en/latest/`.

The dependency declaration can still serve as the first compatibility check:

toml
[project]
name = "django-modeltranslation"
requires-python = "<4,>=3.10"
dependencies = [
    "Django>=5.1",
    "typing-extensions>=4.0.1",
]

Before configuring a first translated model, confirm that the application supports the project's existing Django version and Python runtime. Then use the linked documentation to add the application, register the model fields, generate the required migration, and inspect the admin form. The repository confirms the first and last concepts, but does not document the exact code or migration sequence.

Django admin workflow and inheritance coverage

Django admin integration is more than a convenience listed in the feature summary. It places language-specific content editing into an interface that Django developers already use for records. This is particularly relevant to applications whose translators or editors work through the admin rather than a separate content interface.

The README says the package handles inherited models, explicitly naming both abstract inheritance and multi-table inheritance. This distinction matters because an abstract base model can be reused by multiple concrete models, while a multi-table child has a different database structure. Registration-based support can reduce repeated model edits, but the README does not state how parent and child fields are selected or whether every inherited field qualifies for translation.

The supported field range is broader than text. The README does not enumerate it, so choosing a field solely from its apparent content type would be unsafe. A first implementation should compare the target field type with the external documentation and then inspect the generated database schema. The same-table storage means that the database representation changes even when the source model remains unchanged.

For multilingual teams, the documented fallback and automatic-population features may reduce incomplete editor input. However, the README does not define whether fallback means an empty value, a default language, or another source, nor does it define when population occurs. Those are application-policy decisions that must be resolved from the full documentation rather than inferred from the feature names.

Constraints of same-table translation fields

The most concrete limitation follows from the package's main benefit. Storing translations in the same table avoids expensive joins, but it expands the table and couples translated data to the original model's database lifecycle. Projects with very large or unusually structured tables may need to assess that tradeoff before adoption. The README does not provide storage measurements, migration performance guidance, or row-size limits.

The unchanged model class also does not mean an unchanged database. Applications that prohibit schema changes, use an externally managed schema, or cannot create the additional fields required by modeltranslation are poor candidates. The README does not offer a separate storage backend as an alternative, so there is no documented switch for projects that need translation records in another table or service.

Field selection requires the same caution. The statement that the package can handle more than text fields does not identify every eligible field or define behavior for unsupported fields. A failed registration assumption could affect migrations or admin editing, so each target model should be checked against the current documentation. No benchmark or test result is available here to claim that same-table storage is faster for every query shape.

An actual alternative is to alter the owning application's models to define explicit language fields or separate translation models. That approach gives the developer direct control over schema and query code, but it requires touching original model classes and usually introduces application-specific migration and serialization work. Modeltranslation trades some of that manual control for registration, same-table storage, and admin integration.

Release activity, license, and dependency maintenance

The repository is not archived, and its last push was on 2026-09-17. Recent releases include v0.20.6 on 2026-09-07, v0.20.5 on 2026-09-05, and v0.20.4 on 2026-09-03. This is recent maintenance activity, but the release list alone does not establish compatibility with every Django application or remove the cost of reviewing migrations and model behavior.

The declared license is BSD-3-Clause, with the license text stored in `LICENSE.txt`. The package also identifies maintainers and provides a mailing list and changelog through its project metadata. License obligations should be checked against the actual distribution and deployment context, rather than inferred from the license label alone.

Development dependencies include `pytest`, `pytest-django`, `mypy`, `ruff`, `build`, and other tooling. The Makefile exposes commands for building, testing, linting, type checking, syncing development dependencies, and recreating test migrations. For example, the documented test command is:

bash
uv run --no-sync pytest

That command belongs to the repository's development setup rather than application installation. The build target uses `python -m build --installer uv`, and publishing uses `twine upload dist/*` after building. These targets show that release work is scripted, while the README does not document a rollback procedure.

Editorial conclusion

Projects with multilingual Django content should consider django-modeltranslation when same-table storage, admin integration, and registration outside model classes are priorities. Projects that cannot change database tables or dependency versions should look elsewhere. Before adoption, verify the documented registration pattern against the target models and confirm that the Python and Django versions fit the existing application.

Frequently asked questions

What does django-modeltranslation translate in Django projects?

It translates dynamic content stored in existing Django models and supports arbitrary numbers of languages through a registration approach. It is intended for database content rather than interface strings.

Does django-modeltranslation change the original Django model class?

No. The documented approach registers translations separately, so the original model class does not need to be changed. The resulting translation fields still require the corresponding database schema changes.

What Python and Django versions does django-modeltranslation require?

The package metadata requires Python 3.10 or newer below version 4 and Django 5.1 or newer. It also requires `typing-extensions` 4.0.1 or newer.

Official sources

  1. deschler/django-modeltranslation on GitHub
  2. Issues
  3. License: BSD-3-Clause
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/deschler-django-modeltranslation.svg)](https://hysenlabs.com/projects/deschler-django-modeltranslation)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/deschler-django-modeltranslation.svg)](https://hysenlabs.com/projects/deschler-django-modeltranslation)

Was this useful?