Django - auf ManyToMany Felder zugreifen

Django, Flask, Bottle, WSGI, CGI…
Antworten
ooHeinzz
User
Beiträge: 18
Registriert: Sonntag 30. Oktober 2022, 07:03

Ich speichere in einer Datenbank Essen ab (bei mir 'Gerichte' genannt) Für die Zutaten gibt es eine eigene Tabelle.
Auf einer Seite möchte ich neben dem Titel, der Beschreibung und dem Rezept auch die Zutaten ausgeben.

Hier meine Models:

Code: Alles auswählen

class Gerichte(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=200, null=True, blank=True)
    zutaten = models.ManyToManyField("Zutaten")
    rezept = models.TextField(null=True, blank=True, default="Zutaten zubereiten und abschmecken. Gericht in passenden Geschirr servieren.")
    active = models.BooleanField(default=False)
    slug = models.SlugField(unique=True)
     
    def __str__(self) -> str:
        return self.name



class Zutaten(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(null=True, blank=True)
    gruppe = models.ForeignKey('GruppeZutaten', on_delete=models.SET_NULL, null=True)
    slug = models.SlugField(unique=True)    
    
    def __str__(self) -> str:
        return self.name
Mit dem View für die Anzeige habe ich Probleme. Ich bekomme es nicht hin eine Liste mit den Zutaten auszugeben. Mir ist auch nicht klar, wie die Zutaten in der Tabelle 'Gerichte' abgespeichert sind. Ich hätte gedacht als Liste der Zutaten-id's. Mein Gedanke war in einer For-Schleife zu jeder id die Zutat in eine neue Liste zu schreiben - hat bisher aber nicht geklappt :-(

Hier der Code vom View:

Code: Alles auswählen

def gericht_details(request, id):
    selected_gericht = Gerichte.objects.get(pk=id)
    return render(request, 'essensPlan/gericht-detail.html', {
        'name': selected_gericht.name,
        'description': selected_gericht.description,
        'rezept': selected_gericht.rezept
        # 'zutaten:' Liste der Zutaten von selected_gericht
   })
Für einen Tipp wär ich sehr dankbar.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Gib doch einfach das ganze "selected_gericht" (was für ein Name) in das Template und greife dort auf die Attribute zu. Es wäre auch gut, bei der Abfrage "select_related" zu benutzen.

Code: Alles auswählen

def gericht_details(request, id):
    selected_gericht = Gerichte.objects.select_related().get(pk=id)
    return render(request, 'essensPlan/gericht-detail.html', {'gericht': selected_gericht})
Und im Template dann:

Code: Alles auswählen

{{ gericht.name }}

Zutaten:
{% for zutat in gericht.zutaten.all %}
  {{ zutat.name }}
{% endfor %}
Ich hab jetzt mal auf HTML verzichtet.

Viele Grüße
Whitie

Edit: Die Models sollten auch nach der Einzahl benannt sein, es wird ja immer ein Gericht oder eine Zutat repräsentiert.
ooHeinzz
User
Beiträge: 18
Registriert: Sonntag 30. Oktober 2022, 07:03

Vielen Dank für den Tipp. So klappt's.

"select_related()" hat mir gefehlt.

(Ich habe mein Projekt mit der Erstellung der models angefangen. Zu dem Zeitpunkt erschien mir die Namensgebung sehr logisch (ich wollte ja viele Gerichte erfassen)).

...aber Erfahrungen sammeln, war Teil des Plans.

Viele Grüße ooHeinzz
Antworten