【问题标题】:ORM - Django query grouping and joining itselfORM - Django 查询分组和加入自身
【发布时间】:2015-08-15 07:52:21
【问题描述】:

我正在开发一个程序来跟踪你已经在 dota2 上玩过的人,但我不知道如何将此 sql 查询转换为 django 查询。

模型是:

class Match(models.Model):
    ...

class Account(models.Model):
    ...

class MatchPlayer(models.Model):
    match = models.ForeignKey(Match)
    player_account = models.ForeignKey(Account)
    ...

我想翻译的查询是这样的:

SELECT count(*), dmp1.player_account_id, dmp2.player_account_id 
FROM matchplayer dmp1
JOIN  matchplayer dmp2 on dmp1.match_id = dmp2.match_id
WHERE dmp1.player_account_id=<some account id>
GROUP BY 2, 3
ORDER BY 1 desc

是否可以将其转换为 django 查询或者我必须将其用作 SQL?

【问题讨论】:

标签: python django join orm django-queryset


【解决方案1】:

假设你想知道与pk=1的玩家交手过的玩家:

queryset = Account.objects.filter(matchplayer__match__in=[m.pk for m in Match.objects.filter(matchplayer__player_account=1)]).exclude(pk=1).annotate(count=Count('matchplayer__match'))

您将获得所有匹配玩家的查询集,每个对象都包含一个新属性“count”,对应于特定玩家与我们的目标玩家 pk=1 对战的次数。因此,您可以执行以下操作(假设 Account 对象具有“名称”字段):

[(p.name, p.count) for p in queryset]

【讨论】:

  • 我试过你难过的,但是它抛出“Exception Value: too many SQL variables”,因为你的查询两次到达数据库,你的lambda表达式会变成参数,还有一些玩家有更多超过 3k 游戏。
猜你喜欢
  • 2012-03-28
  • 2020-05-26
  • 2014-05-19
  • 2022-01-21
  • 2019-12-18
  • 1970-01-01
  • 2020-01-26
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多