Anweisungen meines Vorgesetzten: "Ich möchte vermeiden, dass Logik in die models.py
Datenbank eingefügt wird. Von nun an verwenden wir diese als einzige Klassen für den Zugriff auf die Datenbank und behalten die gesamte Logik in externen Klassen, die die Modellklassen verwenden, oder umschließen sie."
Ich denke, das ist der falsche Weg. Ich halte es für eine schlechte Idee, die Logik aus den Modellen herauszuhalten, nur um die Datei klein zu halten. Wenn die Logik im Modell am besten ist, sollte sie dort wirklich eingesetzt werden, unabhängig von der Dateigröße.
Gibt es also eine einfache Möglichkeit, Includes zu verwenden? In PHP-Sprache möchte ich dem Supervisor vorschlagen, dass wir nur models.py
() die Modellklassen von anderen Orten einbeziehen. Konzeptionell würde dies den Modellen ermöglichen, die gewünschte Logik zu haben und gleichzeitig die Dateigröße durch Erhöhen der Anzahl der Dateien niedrig zu halten (was zu weniger Problemen bei der Revisionskontrolle wie Konflikten usw. führt).
Gibt es eine einfache Möglichkeit, Modellklassen aus der Datei models.py zu entfernen, aber funktionieren die Modelle trotzdem mit allen Django-Tools? Oder gibt es eine völlig andere und dennoch elegante Lösung für das allgemeine Problem einer "großen" Datei models.py? Jede Eingabe wäre dankbar.
quelle
Antworten:
Mit Django können Sie viele kleine Anwendungen anstelle einer großen Anwendung erstellen.
In jeder großen Anwendung gibt es viele kleine Anwendungen, die Schwierigkeiten haben, frei zu sein.
Wenn Sie
models.py
sich groß fühlen, tun Sie zu viel. Halt. Entspannen. Zersetzen.Finden Sie kleinere, möglicherweise wiederverwendbare kleine Anwendungskomponenten oder -teile. Sie müssen sie nicht wirklich wiederverwenden. Denken Sie nur an sie als potenziell wiederverwendbar.
Berücksichtigen Sie Ihre Upgrade-Pfade und zerlegen Sie Anwendungen, die Sie möglicherweise eines Tages ersetzen möchten. Sie müssen sie nicht wirklich ersetzen, aber Sie können sie als eigenständiges "Modul" der Programmierung betrachten, das in Zukunft möglicherweise durch etwas Kühleres ersetzt wird.
Wir haben ungefähr ein Dutzend Anwendungen, jede
model.py
ist nicht mehr als ungefähr 400 Codezeilen. Sie konzentrieren sich alle auf weniger als ein halbes Dutzend diskreter Klassendefinitionen. (Dies sind keine harten Grenzen, sondern Beobachtungen über unseren Code.)Wir zersetzen uns früh und oft.
quelle
Es ist natürlich, dass Modellklassen Methoden enthalten, um das Modell zu bearbeiten. Wenn ich ein Buchmodell habe, mit einer Methode
book.get_noun_count()
, gehört es dorthin - ich möchte nicht "get_noun_count(book)
" schreiben müssen , es sei denn, die Methode gehört tatsächlich zu einem anderen Paket. (Dies kann beispielsweise der Fall sein, wenn ich ein Paket für den Zugriff auf die Amazon-API mit "get_amazon_product_id(book)
" habe.)Ich zuckte zusammen, als Djangos Dokumentation vorschlug, Modelle in eine einzige Datei zu packen, und ich brauchte von Anfang an ein paar Minuten, um herauszufinden, wie ich sie in ein richtiges Unterpaket aufteilen konnte.
__init__.py
sieht aus wie:so kann ich immer noch "from site.models import Book" schreiben.
Der einzige Trick besteht darin, dass Sie die Anwendung jedes Modells aufgrund eines Fehlers in Django explizit festlegen müssen: Es wird davon ausgegangen, dass der Anwendungsname der vorletzte Eintrag im Modellpfad ist. "site.models.Book" führt zu "site", was korrekt ist; "site.models.book.Book" lässt vermuten, dass der Anwendungsname "models" lautet. Dies ist ein ziemlich böser Hack von Djangos Seite; Es sollte wahrscheinlich die Liste der installierten Anwendungen nach einer Präfixübereinstimmung durchsuchen.
Sie könnten wahrscheinlich eine Basisklasse oder eine Metaklasse verwenden, um dies zu verallgemeinern, aber ich habe mich noch nicht darum gekümmert.
quelle
Ich kann nicht genau verstehen, welches der vielen möglichen Probleme Sie haben könnten. Hier sind einige Möglichkeiten mit Antworten:
mehrere Modelle in derselben Datei
Legen Sie sie in separate Dateien. Wenn Abhängigkeiten bestehen, verwenden Sie den Import, um die zusätzlichen Modelle abzurufen.
Fremdlogik- / Dienstprogrammfunktionen in models.py
Legen Sie die zusätzliche Logik in separate Dateien.
statische Methoden zur Auswahl einiger Modellinstanzen aus der Datenbank
Erstellen Sie einen neuen Manager in einer separaten Datei.
Methoden, die offensichtlich mit dem Modell zusammenhängen
save, __unicode__ und get_absolute_url sind Beispiele.
quelle