首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多重关系的模型优化设计

基于多重关系的模型优化设计
EN

Stack Overflow用户
提问于 2019-05-24 22:18:57
回答 1查看 296关注 0票数 0

我正在努力创造一个联盟的领导板,我正试图决定一个最优的结构,以避免问题的出现。

目前,我有三个模型,代表我希望收集的数据。SeasonChallengeAttempt

代码语言:javascript
复制
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)

现在,我假设下面的陈述是正确的,我希望从中得到答案。

  1. 一个季节持续一年
  2. 一次挑战持续一个月
  3. 一个季节可能会有很多挑战
  4. 挑战可能有很多次尝试。
  5. 一个挑战不能只属于一个季节。
  6. 一次尝试不能属于一个以上的挑战。

当我试图显示数据时,我感到的困难将呈现出来。我想返回当前赛季的领导板,它计算用户对每个挑战的最佳尝试,并返回与用户及其整个赛季的总分有关的查询集。

示例数据

代码语言:javascript
复制
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
)

预期结果

  1. 挑战者2-20分
  2. 挑战者1-10分

如何使这个模型更好地表示我需要的结果。我看过一段直截了当的关系,但我不确定我是否完全理解它,或者这里是否需要它。

另外,如何使用ORM来获得我想要的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 23:15:37

你的模型不错,别改。要想得到您想要的结果,请尝试如下所示:

代码语言:javascript
复制
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‘和’名称‘进行分组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56300085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档