Seite 1 von 1
django: Wie viel logik im Model?
Verfasst: Mittwoch 30. April 2008, 12:49
von jens
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?
Re: django: Wie viel logik im Model?
Verfasst: Mittwoch 30. April 2008, 13:43
von Leonidas
jens hat geschrieben:Nett wäre es ja, wenn man eine Model-Klasse durch erben erweitern kann, geht aber nicht...
Kannst du. Außerdem kannst du Mixins verwenden.
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.
Verfasst: Mittwoch 30. April 2008, 13:52
von jens
Hort sich gar nicht so schlecht an... Kannst du mal ein kleines Beispiele zeigen?
Verfasst: Mittwoch 30. April 2008, 14:06
von Leonidas
jens hat geschrieben:Hort sich gar nicht so schlecht an... Kannst du mal ein kleines Beispiele zeigen?
Für was, für Mixins oder Logik im Model?
Verfasst: Mittwoch 30. April 2008, 14:18
von jens
Was du benutzt... Machst du es über mixins oder direkt in der Model Klasse?
Verfasst: Mittwoch 30. April 2008, 16:27
von Leonidas
jens hat geschrieben:Machst du es über mixins oder direkt in der Model Klasse?
Beides.
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?

Verfasst: Mittwoch 30. April 2008, 18:01
von EnTeQuAk
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`.
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...
So finde ich das recht gut strukturiert.
Gruß, Christopher
Verfasst: Mittwoch 30. April 2008, 20:51
von jens
Danke ihr habt mir wirklich weiter geholfen...
Re: django: Wie viel logik im Model?
Verfasst: Mittwoch 30. April 2008, 22:07
von sma
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"...
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.
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')
Stefan
Verfasst: Montag 19. Mai 2008, 21:30
von jens
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?
Verfasst: Montag 19. Mai 2008, 22:44
von Leonidas
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.
Verfasst: Dienstag 20. Mai 2008, 13:26
von EnTeQuAk
jens hat geschrieben:Weiß jemand wie das andere große django Projekte handhaben?
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.
MfG EnTeQuAk
Verfasst: Dienstag 20. Mai 2008, 20:38
von Y0Gi
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.
Das klingt schön einfach, aber ich bin da selbst bei einem eher kleinen Projekt schon wegen gegenseitiger Abhängigkeiten jäh dran gescheitert.
Verfasst: Freitag 23. Mai 2008, 15:03
von jens
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.