Seite 1 von 1

Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 17:02
von ready
Hallo Leute,

ich suche nach einer Möglichkeit einen einfachen SQL JOIN mit dem ORM abzubilden, bei Google hab ich auf die schnelle nix passendes gefunden.
Kennt Ihr eine Möglichkeit?

Als Beispiel SQL den ich abbilden möchte führe ich an:

Code: Alles auswählen

SELECT u.username, p.firstname, p.lastname FROM auth_user u, user_profiles p WHERE u.id=p.user_id
Vielen Dank und Viele Grüße
-ready

Re: Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 21:11
von /me
ready hat geschrieben:

Code: Alles auswählen

SELECT u.username, p.firstname, p.lastname FROM auth_user u, user_profiles p WHERE u.id=p.user_id
Das ist hässlich. Ich würde es so schreiben:

Code: Alles auswählen

SELECT
    u.username, p.firstname, p.lastname
  FROM
    auth_user u
  JOIN user_profiles p ON
    p.user_id = u.id
Unabhängig davon fehlt allerdings das Wissen über eine entscheidende Sache: Wie sehen die Modelle zu den beiden Tabellen aus? Ist die Beziehung ein ForeignKey oder ein OneToOneField? Erklärt wird die grundlegende Verwendung von beiden übrigens in der Django-Dokumentation unter Models.

Re: Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 21:18
von jens

Re: Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 21:22
von ready
Hi,

danke für deine Antwort. Es ist natürlich eine ForeignKey Beziehung.
Ich poste mal nicht das ganze Profile Model, sondern nur den relevaten Code:

Code: Alles auswählen

class Profile(models.Model):
  " User profile model "
  user = models.ForeignKey(User, unique=True)
  firstname = models.CharField(_('Vorname'), max_length=255)
  lastname = models.CharField(_('Nachname'), max_length=255)

  class Meta:
    db_table = 'user_profiles'
Das User Model dürfte ja klar sein.

viele Grüße
-ready

Re: Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 21:28
von ready
Also bevor es Missverständnisse gibt: Mein Anwendungsfall ist folgender:

Ich baue eine Seite wo sämtliche User gelistet sind in einer Tabelle mit dem Feld "username" (Aus dem User Model) und z.B. "firstname" und "lastname" (Aus dem Profile Model). Normale Weg wäre jetzt. User.objects.all() und dann über get_profile ein dict bauen mit den ganzen Feldern die man aus dem Profil noch braucht und das dann ans Template übergeben. Das macht bei 100 Benutzern ca. 101 Querys und genau das will ich eben nicht! Mit einem Join kann man es mit einem Query erledigen.
Ich könnte es natürlich direkt in SQL machen, meine Frage ist nun wie man das mit dem ORM abbilden kann.

-ready

Re: Django einfacher Join mit ORM

Verfasst: Mittwoch 2. Mai 2012, 22:51
von apollo13
Du willst dir select_related und prefetch_related anschauen.

Re: Django einfacher Join mit ORM

Verfasst: Freitag 4. Mai 2012, 13:54
von ready
Alles klar. Danke apollo13 :)