20

Dies ist eine ziemlich einfache Django-Muster-Frage. Mein Managercode lebt normalerweise in models.py, aber was passiert, wenn models.py wirklich riesig ist? Gibt es ein anderes alternatives Muster, um Ihren Manager-Code in models.py für die Wartbarkeit freizugeben und zirkuläre Importe zu vermeiden?Wo sollte Django-Manager-Code leben?

Eine Frage kann gefragt werden, warum models.py ist so riesig, aber nehmen wir einfach an, es ist Größe und Breite des Nutzens gerechtfertigt ist.

Antwort

21

Ich bevorzuge es, meine Modelle in models.py und Manager in manager.py (Formulare in forms.py) alle innerhalb der gleichen App zu halten. Für generische Manager möchte ich sie lieber in core.managers aufbewahren, wenn sie für andere Apps wiederverwendet werden können. In einigen unserer größeren Apps mit models/modelname.py gibt es einen Manager und den Modellcode, der nicht schlecht aussieht.

+1

Wie gehen Sie dann sauber mit models.py um, die manager.py importieren muss und umgekehrt? – Jeff

+24

manager.py sollte keine Modelle importieren müssen - das betreffende Modell wird immer als 'self.model' im Manager verfügbar sein. – jacobian

+5

Das ist großartig ... es sei denn, das QuerySet Ihres Managers muss auf ein anderes Modell verweisen - dann können Sie es nicht importieren und müssen es in models.py einfügen (z. B. wenn Sie Elemente ausschließen, die in einem anderen Modell existieren, usw.). –

3

Ich habe beim Erstellen von Django-Apps eine [modelname] .py-Datei mit dem spezifischen Modellcode, Managercode und manchmal Formularcode erstellt und dann eine __init__.py-Datei zum Importieren in das models-Verzeichnis verwendet. Das half mir zumindest, es überschaubar zu halten.

+0

Wenn ich das machen würde, würde ich all diese Dateien in einen 'models' Ordner legen. Es wird den App-Root sauber halten und die Importe besser organisieren. – jangeador

6

Ich stelle immer meine in manager.py. Wenn Sie ein zirkuläres Importproblem haben, denken Sie daran, dass Sie a) Sie können die Modellklasse für einen Manager bei self.model referenzieren und b) Sie können Importe innerhalb von Funktionen durchführen.

+0

+1 für die Erinnerung, dass Sie innerhalb einer Funktion importieren können. In meinem Fall musste ich ein externes Modell für meinen Manager verwenden und ich fügte "apps.get_model (app_label = 'app_name', model_name = 'model_name')' 'in die Methode ein – jangeador

7

Ihre beste Wette mit einem großen Satz von Modellen ist es, django Module zu Ihrem Vorteil zu verwenden, und erstellen Sie einfach einen Ordner namens Modelle. Verschieben Sie Ihre alte models.py in diesen Modellordner und benennen Sie sie in __init__.py um. Auf diese Weise können Sie jedes Modell in spezifischere Dateien innerhalb dieses Modellordners aufteilen.

Sie müssten dann nur jedes Modell in den Namensraum __init__.py importieren.

So zum Beispiel, können Sie es in trennen:

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

Dann wird Ihr __init__.py kann nur sein:

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

Dies ist die Struktur, die ich benutze, wenn meine Modell-Dateien erhalten riesig, aber ich versuche, Dinge so oft wie möglich in Pluggable-Apps zu trennen - so wird das selten von mir verwendet.

Hoffe, das hilft.

Verwandte Themen