32

次のモデルがあるとします。

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)

django の ORM を使用して同等の SQL クエリを実行したい:

SELECT *

FROM PlayerStats

JOIN Player ON player

JOIN PositionStats ON PositionStats.position = Player.position

django の ORM でそれを行うにはどうすればよいですか? クエリは正確には正しくありませんが、アイデアは、django の ORM を使用して、プレイヤーの位置に基づいてPlayerStats参加できる単一のクエリが必要だということです。PositionStats

4

5 に答える 5

32

私はしばらくの間djangoで作業しており、テーブルの結合を理解するのにかなり苦労しましたが、最終的に理解したと思います.それと。

次の 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'

location_idここで、 inEventsBoardmeetingが id in の外部キーであることがわかりますEventsMeetinglocationEventsMeetinglocationこれは、 を介しての情報を照会できることを意味しますEventsBoardmeeting

次に、次の views.py を検討してください。

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

他の投稿で何度も述べたように、django は自動的に結合を処理します。すべてを照会するとEventsBoardmeeting、外部キーによって関連情報も取得されますが、html でこれにアクセスする方法は少し異なります。その結合に関連付けられた情報にアクセスするには、外部キーとして使用される変数を調べる必要があります。例えば:

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

上記は、外部キーの結合の結果であるテーブル内のすべての名前を参照します。xは基本的にEventsBoardmeetingテーブルであるため、アクセスするときx.location_idは外部キーにアクセスしているため、 の情報にアクセスできますEventsMeetinglocation

于 2016-12-16T19:54:34.447 に答える
13

これは1つのクエリではありませんが、かなり効率的です。これにより、関連するテーブルごとに1つのクエリが実行され、Pythonでそれらが結合されます。詳細はprefetch_relatedこちら:https ://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related

Player.objects.filter(name="Bob").prefetch_related(
        'position__positionstats_set', 'playerstats_set')
于 2012-10-27T01:25:41.100 に答える
-3

インポート接続からdjango.dbビューに次のステートメントを含めます。

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()
于 2013-09-26T13:34:59.443 に答える