Model Design [Django]

Django, Flask, Bottle, WSGI, CGI…
Antworten
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Ich versuche mir eigentlich einen schönen Programmierstiel anzugewöhnen, weshalb ich gerne wissen würde, wie ich die Models in meinem Projekt am besten Organisiere.

Ich programmiere eine Webseite um ein Sportevent zu organisieren. An diesem werden verschiede Sportarten mit verschiedener Anzahlen an möglichen Spielern angeboten. Auf der Webseite soll man dann später selber ein Team erstellen usw. können, und sie auch organisieren.

Soll ich die die Variable für die möglichen Anzahl der Spieler eines Team-models:

Code: Alles auswählen

class Team(models.Model):
    name = models.CharField(max_length=15)
    spiel = models.ManyToManyField(Spiel, blank=True)  # Relation zu einem Spiel-model, was Spieldaten usw. enthält
    profile = models.ManyToManyField(Profile)  # User-relation

    def __str__(self):
        return self.name
als ein Attribut im Model festlegen,

Code: Alles auswählen

spieler_anzahl = models.IntegerField()
oder die verschiedenen Spielarten als Subclasses definieren ?

Code: Alles auswählen

class ETRTeam(Team):
    member_max = MAX_TEAM_MEMBERS_ETR

    class meta:
        verbose_name = 'Escape the Room Team'
        verbose_name_plural = 'Escape the Room Teams'


class STLTeam(Team):
    member_max = MAX_TEAM_MEMBERS_STL

    class meta:
        verbose_name = 'Staffellauf Team'
        verbose_name_plural = 'Staffellauf Team'
(So habe ich es in meinem aktuellen Code)

Das schöne daran ist, dass die Admin page für alle Teamarten ein Unterfeld hat.
Das Blöde ist, dass ich nicht genau weiß, wie ich dann querrys für nur eine Teamart laufen lassen soll, da die Profil(User)-instanzen nur ein field (user.profile.team_set) für alle Teamarten haben.

Code: Alles auswählen

user.profile.team_set.all().filter(class = ETRTeam)
geht ja leider nicht.

Also ich könnte wahrscheinlich eigene Lookups schreiben, oder die Objekte des Querysets mit "isinstance()" nochmal filtern, aber das fühlt sich nicht richtig an, und ich glaube, dass mein Model-entwurf falsch ist. Deswegen dieses Forum.

Gibt es eine Seite, auf der man den Weg zu programmieren, den sich die Django developper vorgstellt haben, sehen kann ?

Vielen Dank für alle Denkanstöße und Hilfe :3
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Ach ja, noch ein kleiner Schönheitsfehler:
Ich habe ein Bisschen mit der Datenbank rumgespielt und auch geflushed... jetzt hat mein neuester Benutzer den primary key 9... kann ich den irgendwie wieder auf eins setzen ?
Stört mich irgendwie, das zu sehen xD
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Septias: Das sollte Dich nicht stören, denn die IDs müssen nur eindeutig sein. Weder müssen die bei 1 anfangen (warum nicht bei 0?) noch müssen die aufsteigend sein, noch müssen die zusammenhängend vergeben werden. Meistens sind sie aufsteigend aber zusammenhängend meistens nicht durchgehend, denn es gibt ja Transaktionen die auch abgebrochen werden können. Da zusammenhängend aufsteigende IDs zu gewährleisten wäre aufwändig ohne das das Sinn machen würde.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Septias: Das Django-ORM unterstützt zwar Vererbung (auch mit abstrakten Klassen), es ist in der Praxis aber keine gute Idee, dies zu nutzen. Nimm Dir am besten ein großes Blatt Papier und erstelle ein ER-Diagramm. So könnte ein Team als Eigenschaften beispielsweise einen Namen, eine Relation zu den Spielern sowie eine Spielart haben (können Spieler auch in verschiedenen Teams sein?). Die Spielart könnte wiederum u.a. einen Namen sowie eine Information über die maximale Spielerzahl pro Team haben (die ja nicht vom Team abhängt, sondern von der Spielart). So kannst Du eine Struktur entwerfen und dann mit dem Django-ORM abbilden. Ein gutes Datenbankdesign ist nicht trivial.
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

__blackjack__ hat geschrieben: Freitag 29. Juni 2018, 19:27 @Septias: Das sollte Dich nicht stören, denn die IDs müssen nur eindeutig sein. Weder müssen die bei 1 anfangen (warum nicht bei 0?) noch müssen die aufsteigend sein, noch müssen die zusammenhängend vergeben werden. Meistens sind sie aufsteigend aber zusammenhängend meistens nicht durchgehend, denn es gibt ja Transaktionen die auch abgebrochen werden können. Da zusammenhängend aufsteigende IDs zu gewährleisten wäre aufwändig ohne das das Sinn machen würde.
@__blackjack__ ja ich weiß, dass es egal ist... es stört mich nur ein bisschen, dass die Nummern ab 9 benutzt werden, obwohl 0-8 garnicht verwendet werden... wie gesagt, nur nen kleiner Schönheitsmarkel.
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Vergiss deine Models komplett, vergiss Django. Deine Datenbank ist relationell und nicht objekt orientiert. Lern SQL und konzentrier dich aufs Schema in der Datenbank. Wenn du dies kannst, ist es auch ziemlich einfach Models zu entwerfen mit denen du die Daten als Objekte repräsentieren kannst.
Antworten