Seite 1 von 1

Django: Join-Abfrage

Verfasst: Sonntag 10. Dezember 2017, 09:34
von luvlinux
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.

Re: Django: Join-Abfrage

Verfasst: Sonntag 10. Dezember 2017, 18:21
von Piet Lotus
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

Re: Django: Join-Abfrage

Verfasst: Sonntag 10. Dezember 2017, 19:36
von noisefloor
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:

Code: Alles auswählen

from django.db import models

class Album(models.Model):
    title = models.CharField(max_length=50)
    artist = models.CharField(max_length=50)

    def __str__(self):
        return '{} from {}'.format(self.title, self.artist)

class Track(models.Model):
    track = models.CharField(max_length=50)
    album = models.ForeignKey(Album)

    def __str__(self):
        return '{} on {}'.format(self.track, self.album)
Abfrage in der Django-Shell:

[codebox=pycon file=Unbenannt.txt]>>> from albumsearch.models import Album, Track
>>> results = Album.objects.filter(track__track='Last Christmas')
>>> for result in results:
... print(result.title)
...
Music from the Edge of Heaven
Bravo Hits 1986
>>>[/code]

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

Gruß, noisefloor

Re: Django: Join-Abfrage

Verfasst: Dienstag 12. Dezember 2017, 17:54
von luvlinux
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