2012-04-03 6 views
4

Ich habe ein Django-Projekt, das immer komplexer wird. Ich begann mit den traditionellen Dateien: models, views und forms.py. Das Problem, das ich gerade habe, ist, dass diese Dateien immer größer werden und ich sie in überschaubare Teile aufteilen möchte. Was sind die besten Praktiken dabei?Wie strukturiere ich ein komplexes Django-Projekt?

Darüber hinaus frage ich mich, ob es die beste Methode ist, Klassenmethode zu einem Modell in Django hinzuzufügen? Zum Beispiel habe ich eine Abstimmungsklasse, zu der ich Methoden hinzufügen möchte, um die Anzahl der Stimmen für einen bestimmten Benutzer, Inhalt usw. zu erhalten?

+3

Der offizielle Django Rat scheint zu sein "benutzen Sie Manager" aber lesen Sie Blogposts darüber; Ich finde Klassenmethoden bequemer – agf

+0

@agf Ich stimme zu - Ich habe es noch die Mühe eines Managers, vor allem angesichts der Tatsache zu finden, dass man Klassenmethoden in Basisklassen herausrechnen kann. – Marcin

+0

Wo finde ich ein Beispiel dafür? Was ist mit der Anzahl der Ansichten und Formulare, die alle in einer eigenen Datei landen? – Martin

Antwort

2

Ich finde Refactoring kann wirklich helfen. Gibt es viele ähnliche Ansichten, die nur unterschiedliche Vorlagen oder Abfragegruppen haben? Erstellen Sie eine allgemeinere Ansicht, die mehrere Vorlagennamen, Datensätze usw. akzeptiert.

Alles, was umfangreiche Berechnungen erfordert, wird in ein utils.py im selben Verzeichnis verschoben.

Klassenmethoden sind für Aktionen, die einen einzelnen Datensatz betreffen; Manager sind dafür zuständig, Datensätze zu filtern oder einen Datensatz zu erstellen.

Wenn Sie bereits den Schritt machen separate models, views, etc. Ordner zu erstellen und Ansichten und Modelle in separate Dateien zu brechen, schlägt das für mich vor, dass Sie sie in separaten Apps trennen könnten. Ich mag das als Option viel besser.

+1

Ich stimme Jordan zu. Wenn Modelle, Ansichten usw. zu groß werden, kann dies ein Hinweis darauf sein, dass Sie sie in separate Apps umwandeln können. – tamakisquare

1

Ich benutze sicherlich Klassenmethoden, und ich habe festgestellt, dass, wo es ähnliche Operationen für Klassen gibt, ist es möglich (und einfach), die Klassenmethoden in Basisklassen zu berücksichtigen (verwenden Sie den self Parameter Ihrer Klassenmethode zu schreibe generischen Code).

Wahrscheinlich ist die beste Möglichkeit, zerbrochene Ansichten usw. zu verwalten, jede Datei zu ersetzen, die Sie mit ihrem eigenen Paket trennen möchten, und alles, was Sie benötigen, in das Modul __init__.py des Pakets zu legen.

1

Bei der Verwendung von Modellmanager vs Klassenmethoden. Auf diese Weise ist Ihr Code für andere leichter zu lesen, und Sie können diese Art von Code mit anderen Filtern/select_related/order_by kombinieren. Unten ist ein einfaches Beispiel, aber die Logik wird komplizierter. Manager machen eine großartige Ergänzung für Ihr Setup und für sehr wenig Code, geben Sie viel gutes Bindegewebe in Ihrer App.

Ich stimme Jordan zu, dass Sie mehr als eine App benötigen und wenn Sie jetzt eine große Code-Basis haben, sollten die Zeilen, um alles aufzubrechen durch mehr offensichtlich sein.

class VoteManager(models.ModelManager): 
    def by_user(self, user): 
     return self.filter(user=user) 
    def by_content(self, content) 
     return self.filter(content=content) 

class Vote(models.Model) 
    user = models.ForeignKey(User) 
    content = models.ForeignKey(Content) 
    ... 
    objects = VoteManager() 
Verwandte Themen