Django: Join-Abfrage

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

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: 80
Registriert: Dienstag 14. November 2006, 10:40

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: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
luvlinux
User
Beiträge: 33
Registriert: Donnerstag 24. August 2017, 08:53

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
Antworten