Django 获取集合中对象多对多字段的计数
Django get count of object many to many field in a set
我似乎无法理解 django 中稍微复杂的查询。
我有一个玩家玩过游戏。
每个 play 都有一个多对多字段,players 玩了那个游戏。
对于 player1,我如何计算他使用 django orm 与哪个对手打得最多?
在SQL中,我想这可以从多对多table中计算出来,比如:
SELECT player_id, count(*)
FROM play_player
WHERE play_id in (SELECT play_id FROM play_player WHERE player_id = 'player1_id')
这些是我的模型:
class Game(models.Model):
"""A game to be played and/or owned"""
name = models.CharField(max_length=255)
class Player(models.Model):
"""Someone who plays games"""
name = models.CharField(max_length=255)
games = models.ManyToManyField(Game)
class Play(models.Model):
"""Players have played a game"""
name = models.CharField(max_length=50, null=True, blank=True)
description = models.TextField(max_length=250, null=True, blank=True)
date = models.DateField(
default=timezone.now, help_text='When was the game played?')
game = models.ForeignKey(
Game,
on_delete=models.SET_NULL,
null=True,
help_text='What game was played?')
players = models.ManyToManyField(Player, help_text='Who was playing?')
winner = models.ForeignKey(
Player, on_delete=models.SET_NULL, null=True, related_name='winner')
编辑:
在我在 post 中解释 SQL 可能类似于对多对多 table 的查询之后,我对 google 术语有了一些新想法。
我会再试一次,如果我很快得到它,我会回答我自己的问题。
昨晚我为此大发雷霆,但可能只需要新的一天。在 post.
之前,我需要一只可以与之交谈的橡皮鸭
编辑2:
我 post 在下面编辑了自己的答案,仍然很乐意接受建议。
这是我追求的returns价值观,如果有人有更好的想法,我很乐意接受别人的回答。
def get_most_played_player(self):
my_plays = self.play_set.all()
my_plays_ids = [x.id for x in my_plays]
players_and_count = Play.players.through.objects.filter(
play_id__in=my_plays_ids).values('player_id').annotate(
count=Count('player_id')).all()
for p_c in players_and_count:
print(t)
# {'player_id: 1, 'count': 3}
# etc
return players_and_count
这显然是 returns player_ids 的列表并计数,但是添加 order_by
和 first
就可以了。
我似乎无法理解 django 中稍微复杂的查询。
我有一个玩家玩过游戏。 每个 play 都有一个多对多字段,players 玩了那个游戏。
对于 player1,我如何计算他使用 django orm 与哪个对手打得最多?
在SQL中,我想这可以从多对多table中计算出来,比如:
SELECT player_id, count(*)
FROM play_player
WHERE play_id in (SELECT play_id FROM play_player WHERE player_id = 'player1_id')
这些是我的模型:
class Game(models.Model):
"""A game to be played and/or owned"""
name = models.CharField(max_length=255)
class Player(models.Model):
"""Someone who plays games"""
name = models.CharField(max_length=255)
games = models.ManyToManyField(Game)
class Play(models.Model):
"""Players have played a game"""
name = models.CharField(max_length=50, null=True, blank=True)
description = models.TextField(max_length=250, null=True, blank=True)
date = models.DateField(
default=timezone.now, help_text='When was the game played?')
game = models.ForeignKey(
Game,
on_delete=models.SET_NULL,
null=True,
help_text='What game was played?')
players = models.ManyToManyField(Player, help_text='Who was playing?')
winner = models.ForeignKey(
Player, on_delete=models.SET_NULL, null=True, related_name='winner')
编辑: 在我在 post 中解释 SQL 可能类似于对多对多 table 的查询之后,我对 google 术语有了一些新想法。
我会再试一次,如果我很快得到它,我会回答我自己的问题。 昨晚我为此大发雷霆,但可能只需要新的一天。在 post.
之前,我需要一只可以与之交谈的橡皮鸭编辑2: 我 post 在下面编辑了自己的答案,仍然很乐意接受建议。
这是我追求的returns价值观,如果有人有更好的想法,我很乐意接受别人的回答。
def get_most_played_player(self):
my_plays = self.play_set.all()
my_plays_ids = [x.id for x in my_plays]
players_and_count = Play.players.through.objects.filter(
play_id__in=my_plays_ids).values('player_id').annotate(
count=Count('player_id')).all()
for p_c in players_and_count:
print(t)
# {'player_id: 1, 'count': 3}
# etc
return players_and_count
这显然是 returns player_ids 的列表并计数,但是添加 order_by
和 first
就可以了。