Django使用多对一关系

时间:2017-07-21 17:59:17

标签: python django

我对Django网站开发完全陌生,我在使用多对一关系时遇到了一些问题。我正在尝试完成编码练习,我必须为游戏俱乐部开发一个数据库,其中将有一个成员列表和一个匹配列表。会员列表将存储与会员有关的信息(例如,姓名,他们加入俱乐部的日期,比赛获胜,比赛丢失,平均分数),比赛列表将存储关于每个记录的比赛的数据(例如,谁是球员1和球员2)是,比赛发生的日期和每位球员得分的结果)。我要做的是使用多对一关系将多个匹配链接到成员,然后将匹配结果作为用于计算成员信息的信息。

成员/ models.py:

from django.db import models


class Member(models.Model):
    name = models.CharField(max_length=30)
    match_wins = models.IntegerField()
    match_losses = models.IntegerField()
    date_joined = models.CharField(max_length=10)
    average = models.IntegerField()
    high_score = models.IntegerField()

匹配/ models.py:

from django.db import models
from members.models import Member


class Match(models.Model):
    player1 = models.ForeignKey(Member, on_delete=models.CASCADE)
    player2 = models.ForeignKey(Member, on_delete=models.CASCADE)
    p1_score = models.IntegerField()
    p2_score = models.IntegerField()
    winner = ???(models.Member_id maybe?)
    loser = ???
    date = models.CharField(max_length=10)

作为一个例子,我如何通过搜索归因于member_id x的匹配并根据归因于他的id的每个胜利增加一个值来计算Member类中的match_wins?

对于Member类中的平均值,我将如何再次查询属于member_id x的匹配并增加每个匹配的值,将每个匹配的得分相加并将结果除以递增的值以获得平均?

如何比较归因于member_id x的每个分数以找到最高分?

此外,在比赛方面我如何将p1_score与player1相关联(对于球员2相同)并获得胜利者来比较球员1和2的得分,然后给予得分最高的球员获胜,而另一位球员获得损失?

任何对此的帮助都会非常感激,因为我完全迷失了。是否更容易更换成员和匹配,以便成员拥有匹配的ForeignKey?

1 个答案:

答案 0 :(得分:1)

class Member(models.Model):
    name = models.CharField(max_length=30)
    match_wins = models.IntegerField()
    match_losses = models.IntegerField()
    date_joined = models.CharField(max_length=10)
    average = models.IntegerField()
    high_score = models.IntegerField()


class Match(models.Model):
    player1 = models.ForeignKey(Member, related_name='games_as_player1', on_delete=models.CASCADE)
    player2 = models.ForeignKey(Member, related_name='games_as_player2', on_delete=models.CASCADE)
    p1_score = models.IntegerField()
    p2_score = models.IntegerField()
    winner = models.ForeignKey(Member, related_name='games_won')
    loser = models.ForeignKey(Member, related_name='games_lost')
    date = models.CharField(max_length=10)


player = Member.objects.get(pk=1)
player.games_won.count()

您还需要将related_name添加到player1player2字段,这样您就可以将多个ForeignKeys添加到同一个对象。

此外,我实际上会将关系更改为多对多,并在中间表上存储可能的附加信息,例如他们是哪个播放器。这将消除对冗余字段的需要。也许是这样的:

class Member(models.Model):
    name = models.CharField(max_length=30)
    date_joined = models.CharField(max_length=10)
    matches = models.ManyToManyField(Match, through='MemberMatch')

class MemberMatch(models.Model):
    player = models.ForeignKey(Member)
    match = models.ForeignKey(Match)
    score = models.IntegerField()
    won = models.BooleanField()

class Match(models.Model):
    date = models.CharField(max_length=10)

您可以执行简单的查询以获取我从课程中删除的所有信息。

相关问题