Django: Join-Abfrage

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
luvlinux
User
Beiträge: 21
Registriert: Donnerstag 24. August 2017, 08:53

Django: Join-Abfrage

Beitragvon luvlinux » Sonntag 10. Dezember 2017, 09:34

Guten Morgen,

in meinen bisher geschauten Tutorials habe ich lediglich Abfragen/Ausgaben mit einer Tabelle gehabt. Nun würde ich gerne eine 1:n Abfrage durchführen, also in meiner django-Anwendung alle Alben mit den zugehörigen Songs ausgeben. Mein model sieht derzeit so aus:

Code: Alles auswählen

from django.db import models

# Create your models here.


class Album(models.Model):
    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=500)
    genre = models.CharField(max_length=100)
    album_logo = models.CharField(max_length=1000)

    def __str__(self):
        return self.album_title + self.artist


class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    file_title = models.CharField(max_length=10)
    song_title = models.CharField(max_length=250)
    is_favourite = models.BooleanField(default=False)

    def __str__(self):
        return self.song_title

Ich habe beim googeln bereits Hinweise auf select_related, prefetch_related gefunden, komme da aber nicht klar mit. Könnt ihr mir grob sagen, wie ich da vorgehen soll?

Danke für eure Antwort.
Piet Lotus
User
Beiträge: 74
Registriert: Dienstag 14. November 2006, 10:40

Re: Django: Join-Abfrage

Beitragvon Piet Lotus » Sonntag 10. Dezember 2017, 18:21

Hallo luvlinux,
die offiziellen Django-Doku-Seiten zu dem Thema kennst du aber?
https://docs.djangoproject.com/en/2.0/t ... ationships
bzw. das ausführliche Beispiel
https://docs.djangoproject.com/en/2.0/t ... ny_to_one/
Dort ist zwar von Reportern und Artikeln die Rede, es sollte sich aber auf Alben und Lieder übertragen lassen :)
Hoffe es hilft, wenn nicht geb Bescheid.
Viele Grüße
Piet Lotus
Benutzeravatar
noisefloor
User
Beiträge: 2231
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Django: Join-Abfrage

Beitragvon noisefloor » Sonntag 10. Dezember 2017, 19:36

Hallo,

das geht so, siehe folgendes Beispiel. Der Song "Last Christmas" ist für zwei Alben in der Datenbank hinterlegt, die App heißt "albumsearch".

models.py:
  1. from django.db import models
  2.  
  3. class Album(models.Model):
  4.     title = models.CharField(max_length=50)
  5.     artist = models.CharField(max_length=50)
  6.  
  7.     def __str__(self):
  8.         return '{} from {}'.format(self.title, self.artist)
  9.  
  10. class Track(models.Model):
  11.     track = models.CharField(max_length=50)
  12.     album = models.ForeignKey(Album)
  13.  
  14.     def __str__(self):
  15.         return '{} on {}'.format(self.track, self.album)


Abfrage in der Django-Shell:

  1. >>> from albumsearch.models import Album, Track
  2. >>> results = Album.objects.filter(track__track='Last Christmas')
  3. >>> for result in results:
  4. ...     print(result.title)
  5. ...
  6. Music from the Edge of Heaven
  7. Bravo Hits 1986
  8. >>>


Das ist auch so im von Piet Lotus genannten Link erklärt.

Gruß, noisefloor
Benutzeravatar
luvlinux
User
Beiträge: 21
Registriert: Donnerstag 24. August 2017, 08:53

Re: Django: Join-Abfrage

Beitragvon luvlinux » Dienstag 12. Dezember 2017, 17:54

Zuerst einmal vielen Dank für eure Antworten.

Das Beispiel von noisefloor habe ich bereits versucht und zwar erfolgreich. Hat mir schon etwas weitergeholfen.
Bin mir aber noch über dies und das im Unklaren und möchte deshalb erst das von Piet empfohlene ausführliche Beispiel durcharbeiten. Dann würde ich mich an dieser Stelle nochmals melden.

Hoffe, dass dann so gut wie nichts mehr unklar ist :D

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder