Django - Problem mit Listen

Django, Flask, Bottle, WSGI, CGI…
Antworten
ESP8266Schwabe
User
Beiträge: 16
Registriert: Sonntag 20. Oktober 2019, 11:24

Hi,

ich versuche mich gerade als blutiger Anfänger mit models in Django.

Folgendes möchte ich abbilden:

Ich habe mehrere Pflanzen die habe ich an unterschiedlichen Orten in der Wohnung. Diese möchte ich unter anderem automatisch gießen.

Nun habe ich in ein Modell für Pflanzen angelegt. Jetzt möchte ich ein Modell für den Standort erstellen, weiß aber nicht, wie ich die Pflanzenliste ins Modell Standort einfügen soll?

Mein Modell für Pflanzen sieht bis jetzt so aus:

Code: Alles auswählen

class Pflanze(models.Model):
    namen = models.CharField(max_length=200)
    text = models.TextField()
    sorte = models.ForeignKey('Sorte', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.namen


Das Modell für den Standort bisher so:

Code: Alles auswählen

class Standort(models.Model):
    bezeichnung = models.CharField(max_length=200)
    text = models.TextField()

    def __str__(self):
        return self.bezeichnung


Wie ergänze ich nun das Modell des Standorts, damit ich beliebig viele Pflanzen dem Standort zuordnen kann? Wobei jede Pflanze nur einmal zugeordnet werden soll.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine 1:n oder "one to many" Relation, und wie man die anlegt wird zB hier beschriebe: https://books.agiliq.com/projects/djang ... _many.html

Ueblicherweise steckt diese Information in der abhaengigen Tabelle. Also in deinem Fall Pflanze. Da hat dann jede einen Spalte "standort_id" oder so. Darum wird das auch auf dem Pflanze-Model angelegt werden muessen.
ESP8266Schwabe
User
Beiträge: 16
Registriert: Sonntag 20. Oktober 2019, 11:24

Oh. Aha.

Habe ich also falsch herum gedacht.

Danke für die Hilfe!
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ESP8266Schwabe: Das ist doch im Grunde das gleiche wie bei `Sorte`, was Du ja schon so modelliert hast. Und die Rückrichtung wird automatisch auch erstellt, aber vielleicht möchtest Du da ja weil Du deutschsprachige Bezeichner verwendest, explizit einen Namen für vergeben, denn `pflanze_set` klingt IMHO nicht so gut wie `pflanzen`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ESP8266Schwabe
User
Beiträge: 16
Registriert: Sonntag 20. Oktober 2019, 11:24

Ich möchte Später, wenn ich einen einzelnen Standort anschaue, eine Liste mit dessen Pflanzen haben.

Irgendwie bin ich dann auf den falschen Dampfer geraten und habe nach einer Art Listenfeld im Modell Standort gesucht.

In Wirklichkeit muss ich ja bei der Pflanze den zugehörigen Standort hinterlegen.

Die Liste der Pflanze kann ich mir ja über die Id des Standorts filtern und anzeigen lassen.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde mich wundern wenn es dieses Feature nicht schon eingebaut gibt, das man aus beiden Richtungen der Relation einfach an die jeweils andere Seite kommt ist ein sehr ueblicher Vorgang.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Schrob ich ja schon das die Rückrichtung automatisch erstellt wird. Halt unter dem Namen `FOO_set` wobei `FOO` der kleingeschriebene Klassenname von der Klasse mit dem `ForeignKey` ist. Also `pflanze_set` in diesem Fall. Wenn man ein `Sorte`- oder `Standort`-Exemplar hat, bekommt man beispielsweise mit `sorte_oder_standort.pflanze_set.all()` alle `Pflanze`-Exemplare die von der Sorte oder an dem Standort sind. Wie das Attribut für die Gegenrichtung heissen soll, kann man beim `ForeignKey` angeben wenn man mit der Vorgabe nicht zufrieden ist. Das Attribut ist ein `QuerySet`, das heisst das kann man auch noch weiter einschränken.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten