我正在努力创造一个联盟的领导板,我正试图决定一个最优的结构,以避免问题的出现。
目前,我有三个模型,代表我希望收集的数据。Season,Challenge,Attempt。
class Season(models.Model):
season = models.CharField(max_length=4)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
class Challenge(models.Model):
season = models.ForeignKey(Season, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
class Attempt(models.Model):
challenger = models.ForeignKey(User, on_delete=models.CASCADE)
challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE)
points = models.IntegerField(default=0)现在,我假设下面的陈述是正确的,我希望从中得到答案。
当我试图显示数据时,我感到的困难将呈现出来。我想返回当前赛季的领导板,它计算用户对每个挑战的最佳尝试,并返回与用户及其整个赛季的总分有关的查询集。
示例数据
Season(season='2019',
start_date=..., # some date object
end_date=..., # some date object
)
Challenge(season=1, # represents season object above
name='Challenge 1',
start_date=..., # some date object
end_date=..., # some date object
)
Challenge(season=1, # represents season object above
name='Challenge 2',
start_date=..., # some date object
end_date=... # some date object
)
Attempt(challenger=1, # represents user object
challenge=1, # represents challenge 1 above
points=5
)
Attempt(challenger=2, # represents user object
challenge=1, # represents challenge 1 above
points=10
)
Attempt(challenger=1, # represents user object
challenge=2, # represents challenge 2 above
points=5
)
Attempt(challenger=2, # represents user object
challenge=2, # represents challenge 2 above
points=10
)预期结果
如何使这个模型更好地表示我需要的结果。我看过一段直截了当的关系,但我不确定我是否完全理解它,或者这里是否需要它。
另外,如何使用ORM来获得我想要的结果?
发布于 2019-05-24 23:15:37
你的模型不错,别改。要想得到您想要的结果,请尝试如下所示:
Attempt.objects.filter(challenge__season__season='2019').values('challenger__name').annotate(total_points=Sum('points')).order_by('-total_points')这需要所有的尝试,将它们过滤到名字为“2019”的季节,然后抓住所有挑战者的名字,然后用挑战者的尝试点数之和(这似乎是你想要的,但你也可以用Max代替Sum)。
这种方法的一个问题(顺便说一句,我必须归功于这个消息来源:https://simpleisbetterthancomplex.com/tutorial/2016/12/06/how-to-create-group-by-queries.html )是,如果多个挑战者有相同的名称,他们将被分组在一起,这可能是你不想要的。因此,您可能需要按挑战者'pk‘和’名称‘进行分组。
https://stackoverflow.com/questions/56300085
复制相似问题