我对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?
答案 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
添加到player1
和player2
字段,这样您就可以将多个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)
您可以执行简单的查询以获取我从课程中删除的所有信息。