2012-10-26 13 views
12

Przyjmijmy, mam następujące modele:Jak połączyć dwie tabele w polu klucza obcego za pomocą ORM django?

class Position(models.Model): 
    name = models.CharField() 

class PositionStats(models.Model): 
    position = models.ForeignKey(Position) 
    averageYards = models.CharField() 
    averageCatches = models.CharField() 

class PlayerStats(models.Model): 
    player = models.ForeignKey(Player) 
    averageYards = models.CharField() 
    averageCatches = models.CharField() 

class Player(models.Model): 
    name = models.CharField() 
    position = models.ForeignKey(Position) 

Chcę wykonać równoważne zapytanie SQL za pomocą ORM Django:

SELECT * 

FROM PlayerStats 

JOIN Player ON player 

JOIN PositionStats ON PositionStats.position = Player.position 

Jak miałbym to zrobić z ORM Django? Zapytanie nie jest dokładnie poprawne, ale chodzi o to, że chcę jedno zapytanie, używając ORM django, które daje PlayerStats połączone z PositionStats w zależności od pozycji gracza.

Odpowiedz

0

Od django.db połączenie import W widoku zawierać oświadczenie o następującej treści:

cursor = connection.cursor() 
cursor.execute("select * From Postion ON Position.name = Player.position JOIN 
PlayerStats ON Player.name = 
PlayerStats.player JOIN PositionStats ON Position.name = PositionStats.player") 
solution = cursor.fetchall() 
+0

OP w szczególności wspomina "Chcę wykonać równoważne zapytanie SQL za pomocą ORM Django". Ta odpowiedź podaje surowy sposób SQL, bez korzystania z ORM. – niagr

5

pracuję z Django na chwilę teraz i miałem dość szorstki czas zastanawiać się nad złączami stołowymi, ale myślę, że w końcu rozumiem i chciałbym przekazać to innym, aby mogli uniknąć frustracji, którą miałem z tym.

Rozważmy następujący model.py:

class EventsMeetinglocation(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100) 
    address = models.CharField(max_length=200) 

    class Meta: 
     managed = True 
     db_table = 'events_meetinglocation' 


class EventsBoardmeeting(models.Model): 
    id = models.IntegerField(primary_key=True) 
    date = models.DateTimeField() 
    agenda_id = models.IntegerField(blank=True, null=True) 
    location_id = models.ForeignKey(EventsMeetinglocation) 
    minutes_id = models.IntegerField(blank=True, null=True) 

    class Meta: 
     managed = True 
     db_table = 'events_boardmeeting' 

Tutaj widzimy, że location_id w EventsBoardmeeting jest klucz obcy dla identyfikatora w EventsMeetinglocation. Oznacza to, że powinniśmy być w stanie zapytać o informacje w EventsMeetinglocation, przechodząc przez EventBoardmeeting.

Teraz rozważmy następujący views.py:

def meetings(request): 
    meetingData = EventsBoardmeeting.objects.all() 
    return render(request, 'board/meetings.html', {'data': meetingData }) 

jak wspomniano wiele razy, zanim w maju innych stanowisk, Django opiekuje dołącza automatycznie. Kiedy pytamy o wszystko w EventBoardmeeting, otrzymujemy również wszelkie powiązane informacje za pomocą klucza obcego, ale sposób, w jaki uzyskujemy dostęp do tego w html jest trochę inny. Musimy przejść przez zmienną używaną jako klucz obcy, aby uzyskać dostęp do informacji związanych z tym sprzężeniem. Na przykład:

{% for x in data %} 
    {{ x.location_id.name }} 
{% endfor %} 

Powyższe odwołania dotyczą WSZYSTKICH nazw w tabeli, które były wynikiem dołączenia klucza obcego. x jest w istocie tabelą EventsBoard, więc kiedy mamy dostęp do x.location_id, uzyskujemy dostęp do klucza obcego, który daje nam dostęp do informacji w EventsMeetinglocation.

Powiązane problemy