Django-ORM ohne das Django-Framework benutzen

Der Django-ORM kann auch nützlich sein für Anwendungen, die zwar mit einer Datenbank, aber nicht mit einem Web-Framework arbeiten sollen, und manchmal möchte man auch ein einem Programm mit einer von Django verwalteten Datenbank arbeiten, ohne die gesamte Django-Umgebung zu aktivieren (und vielleicht kommt die Lösung, das Programm als Management-Kommando laufen zu lassen, aus irgendwelchen Gründen nicht in Frage).

Es ist durchaus möglich, lediglich den ORM zu aktivieren, ohne URLs, Views, komplette Settings usw. einzurichten. Ein Blogpost zeigt eine einfache Möglichkeit auf, in wenigen Zeilen alles einzurichten, was für den ORM benötigt wird:

#!/usr/bin/env python3

def init_django():
    import django
    from django.conf import settings

    if not settings.configured:
        settings.configure(
            INSTALLED_APPS=["db"],
            DATABASES={
                "default": {
                    "ENGINE": "django.db.backends.postgresql", "NAME": …
                    }
                }
            )
        django.setup()


if __name__ == "__main__":
    from django.core.management import execute_from_command_line

    init_django()
    execute_from_command_line()

Im Modul db/models.py stehen dann die Klassendefinitionen für die Models:

from django.db import models
from manage import init_django  # oder ggf. "from ..manage …"

init_django()

class MyModel(models.Model):
    …

Es geht noch kürzer:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
django.setup()

In dieser Variante stehen die Settings in einem eigenen Modul project/settings.py, brauchen aber natürlich auch nur das Allernötigste zu umfassen (siehe oben: INSTALLED_APPS und DATABASES).

Wie man's auch macht – man hat dann eine Anwendung, die man leicht nachträglich zu einer vollständigen Web-App aufbohren kann.