Ich frage mich gerade wie viel Logik man eigentlich ins model stecken sollte...
Auf der einen Seite macht es viele Dinge einfacher, wenn man etwas code in's model packt.
Auf der anderen Seite sollte IMHO die Models ja nur die Daten repräsentieren und nicht viel Programm beinhalten. Stichwort "Model View Controller"...
Nett wäre es ja, wenn man eine Model-Klasse durch erben erweitern kann, geht aber nicht...
Wie handhabt ihr das?
django: Wie viel logik im Model?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kannst du. Außerdem kannst du Mixins verwenden.jens hat geschrieben:Nett wäre es ja, wenn man eine Model-Klasse durch erben erweitern kann, geht aber nicht...
Ich habe im Model die Logik, die die Daten bearbeitet direkt drin stehen. Der Controller sagt dem Model nur, was es tun soll, wie das genau passiert, entscheidet das Model. Models als passive Datencontainer zu halten scheint mir etwas sinnbefreit zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Für was, für Mixins oder Logik im Model?jens hat geschrieben:Hort sich gar nicht so schlecht an... Kannst du mal ein kleines Beispiele zeigen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Beides.jens hat geschrieben:Machst du es über mixins oder direkt in der Model Klasse?
Ein Mixin wäre hier (Achtung, etwas veraltet, eine Bugfreiere Version ist noch nicht hochgeladen), und wie man Methoden in der Klasse hinzufügt muss ich dir jetzt nicht zeigen, oder?

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Also wenn ich mit Django arbeite nehm ich die Models tatsächlich nahezu als reine Datencontainer. Lediglich ein paar Funktionen die weitere Infos zu den Daten hinzufügen lege ich an.
Das heißt nicht, das ich nun für jedes model eigene Funktionen irgentwo definiere die die Daten modifizieren oder sowas. Solche Dinge packe ich ins `objects` Objekt, also dem `Manager`.
So finde ich das recht gut strukturiert.
Gruß, Christopher
Das heißt nicht, das ich nun für jedes model eigene Funktionen irgentwo definiere die die Daten modifizieren oder sowas. Solche Dinge packe ich ins `objects` Objekt, also dem `Manager`.
Code: Alles auswählen
from django.db import models
class MyModelManager(models.Manager):
def some_cewl_method(self):
return None
class MyModel(models.Model):
objects = MyModelManager()
# model definition follows here...
Gruß, Christopher
IMHO die falsche Schlussfolgerung. Das Model ist nicht nur ein Datencontainer, sondern sollte auch das Verhalten des der Domäne implementieren. Der Controller soll ja nur die Verbindung zwischen View und Model herstellen, nicht aber das Model fernsteuern. Die Daumregel sollte "fat model, skinny controller" sein.jens hat geschrieben:Auf der anderen Seite sollte IMHO die Models ja nur die Daten repräsentieren und nicht viel Programm beinhalten. Stichwort "Model View Controller"...
Ich sehe nicht, warum du Vererbung brauchst. Du kannst doch die passenden Methoden einfach mit in die Model-Klassen von Django schreiben:
Code: Alles auswählen
class BuildOrder(models.Model):
kind = models.CharField(choices=...)
count = models.IntegerField()
def execute(self, player):
getattr(self, 'build_%s' % self.kind)(player, self.count)
def build_mine(self, player, count):
if player.spend(count * 10):
for i in range(count):
Building.create(owner=player, kind='mine')
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Habe festgestellt das es schon recht nützlich ist, einige Logik in das Model direkt und in den Manager einzubauen.
Ich befürchte nur, das meine models.py irgendwann einfach zu groß und unübersichtlich wird. OK, man könnte jedes model in einer Datei auslagern und alle in model.py importieren.
Weiß jemand wie das andere große django Projekte handhaben?
Ich befürchte nur, das meine models.py irgendwann einfach zu groß und unübersichtlich wird. OK, man könnte jedes model in einer Datei auslagern und alle in model.py importieren.
Weiß jemand wie das andere große django Projekte handhaben?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Model-Packages? Ist ja kein Aufwand ``model.py`` zu splitten und die Teile in einen ``model``-Ordner zu werfen und eine ``__init__.py`` beizupacken.
Ich habe meine größte Site in mehrere Apps aufgeteilt, mit eigenen URLs, Templates und Models. Funktioniert auch ganz gut.
Ich habe meine größte Site in mehrere Apps aufgeteilt, mit eigenen URLs, Templates und Models. Funktioniert auch ganz gut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Auf SQLAlchemy umsteigen *grinz* – Nein, spaß bei Seite... das hängt ja auch davon ab, was für dich „zu groß“ ist. Bei Inyoka (was ja wirklich durchaus groß ist) kommen wir auf ~1200 LOC in den model.py's fürs wiki und forum (jeweils). Da ist aber noch gut Übersicht drinne, bin ich der Meinung. Ansonsten gehts' ja wie Leonidas es schon gesagt hat, nen model-package zu machen.jens hat geschrieben:Weiß jemand wie das andere große django Projekte handhaben?
MfG EnTeQuAk
Das klingt schön einfach, aber ich bin da selbst bei einem eher kleinen Projekt schon wegen gegenseitiger Abhängigkeiten jäh dran gescheitert.Leonidas hat geschrieben:Model-Packages? Ist ja kein Aufwand ``model.py`` zu splitten und die Teile in einen ``model``-Ordner zu werfen und eine ``__init__.py`` beizupacken.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
rantaaho hat bei PyLucid nun mal die Models aufgeteilt und ein packages draus gemacht: http://pylucid.net:8080/pylucid/changeset/1584
Noch haben wir keine Probleme mit gegenseitigen Abhängigkeiten.
