django: Wie viel logik im Model?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 30. April 2008, 12:49

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. April 2008, 13:43

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 30. April 2008, 13:52

Hort sich gar nicht so schlecht an... Kannst du mal ein kleines Beispiele zeigen?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. April 2008, 14:06

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?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 30. April 2008, 14:18

Was du benutzt... Machst du es über mixins oder direkt in der Model Klasse?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. April 2008, 16:27

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? ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Mittwoch 30. April 2008, 18:01

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 30. April 2008, 20:51

Danke ihr habt mir wirklich weiter geholfen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 30. April 2008, 22:07

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 19. Mai 2008, 21:30

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 19. Mai 2008, 22:44

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 20. Mai 2008, 13:26

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 20. Mai 2008, 20:38

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.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 23. Mai 2008, 15:03

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten