Django einfacher Join mit ORM

Django, Flask, Bottle, WSGI, CGI…
Antworten
ready
User
Beiträge: 33
Registriert: Sonntag 15. Juni 2008, 12:21
Kontaktdaten:

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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ready
User
Beiträge: 33
Registriert: Sonntag 15. Juni 2008, 12:21
Kontaktdaten:

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
ready
User
Beiträge: 33
Registriert: Sonntag 15. Juni 2008, 12:21
Kontaktdaten:

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du willst dir select_related und prefetch_related anschauen.
ready
User
Beiträge: 33
Registriert: Sonntag 15. Juni 2008, 12:21
Kontaktdaten:

Alles klar. Danke apollo13 :)
Antworten