2012-10-26 31 views
12

Giả sử tôi có các mô hình sau:Làm cách nào để bạn tham gia hai bảng trên trường khóa ngoài bằng cách sử dụng django ORM?

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) 

Tôi muốn thực hiện các truy vấn SQL tương đương sử dụng ORM django của:

SELECT * 

FROM PlayerStats 

JOIN Player ON player 

JOIN PositionStats ON PositionStats.position = Player.position 

Làm thế nào tôi có thể làm điều đó với ORM django không? Truy vấn không chính xác, nhưng ý tưởng là tôi muốn có một truy vấn duy nhất, sử dụng ORM của django, cung cấp cho tôi PlayerStats đã tham gia với PositionStats dựa trên vị trí của người chơi.

Trả lời

0

Từ django.db kết nối nhập khẩu Theo quan điểm của bạn bao gồm báo cáo kết quả dưới đây:

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 đề cập cụ thể "Tôi muốn thực hiện truy vấn SQL tương đương bằng cách sử dụng ORM của django". Câu trả lời này cung cấp cách SQL thô để thực hiện nó, mà không cần sử dụng ORM. – niagr

5

Tôi đã làm việc với django trong một thời gian bây giờ và tôi đã có một khá thô thời gian tìm ra bảng tham gia, nhưng tôi nghĩ cuối cùng tôi đã hiểu và tôi muốn truyền điều này cho những người khác để họ có thể tránh được sự thất vọng mà tôi có với nó.

Xem xét model.py sau:

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' 

Ở đây chúng ta có thể thấy rằng location_id trong EventsBoardmeeting là khóa ngoại cho id trong EventsMeetinglocation. Điều này có nghĩa là chúng tôi có thể truy vấn thông tin trong EventsMeetinglocation bằng cách thực hiện qua EventsBoardmeeting.

Bây giờ xem xét views.py sau:

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

Như đã trình bày nhiều lần trước khi tháng 5 bài viết khác, django sẽ chăm sóc của gia nhập tự động. Khi chúng ta truy vấn mọi thứ trong EventBoardmeeting, chúng ta cũng nhận được bất kỳ thông tin liên quan nào bằng khóa ngoài, nhưng cách mà chúng ta truy cập vào html này hơi khác một chút. Chúng ta phải đi qua biến được sử dụng như khóa ngoài để truy cập thông tin liên quan đến phép nối đó. Ví dụ:

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

Tham chiếu ở trên TẤT CẢ các tên trong bảng là kết quả của việc tham gia khóa ngoại. Về cơ bản, x là bảng EventsBoardmeeting, vì vậy khi chúng ta truy cập x.location_id, chúng ta đang truy cập khóa ngoài cho phép chúng ta truy cập thông tin trong EventsMeetinglocation.

Các vấn đề liên quan