Django模型设计:单人玩家或团队与玩家在游戏中



我正在设计一个基于Django的web界面的游戏,可以单独或作为一个团队玩。游戏是基于分数;第一个达到设定点数的一方获胜。对于以后的统计和显示,点有一个时间戳。

我的问题:我如何在一个Game中有两个Players或两个Teams ?我的模型现在是这样的:

from django.db import models
# Create your models here.
class Player(models.Model):
slug = models.SlugField(unique=True)    # will be autogenerated when inserting new Instance
name = models.CharField(max_length=100)
wins = models.IntegerField()
losses = models.IntegerField()
picture = models.ImageField(upload_to='images/player_pics')
# games_played = wins + losses 
def __str__(self):
return self.name
class Team(models.Model):
slug = models.SlugField(unique=True)
name = models.CharField(max_length=100)
players = models.ManyToManyField(Player)

wins = models.IntegerField()    # from here on seems redundant to Player class
losses = models.IntegerField() 
picture = models.ImageField(upload_to='images/team_pics')
# games_played = wins + losses 
def __str__(self):
return self.name

class Point(models.Model):
val = models.IntegerField()
timestamp = models.DateTimeField()

class Game(models.Model):
slug = models.SlugField(unique=True)
timestamp = models.DateTimeField()
players = models.ManyToManyField(Player) # here should be either Team or Player
points = models.ManyToManyField(Point)

我的想法是实现像GameParty这样的另一个类,它可以是PlayerTeam,但同样的问题适用于那里。像赢和输这样多余的字段也是我不喜欢的。

您不需要硬编码赢、输和玩的游戏,因为您可以通过使用外键和多对多关系的查询获得这些值(您还可以在模型中创建一个动态属性来返回查询,以避免重复)。修改你的模型:

from django.db import models

class Player(models.Model):
slug = models.SlugField(unique=True)
name = models.CharField(max_length=100)
picture = models.ImageField(upload_to='images/player_pics')
def __str__(self):
return self.name
class Team(models.Model):
slug = models.SlugField(unique=True)
name = models.CharField(max_length=100)
players = models.ManyToManyField(Player)
picture = models.ImageField(upload_to='images/team_pics')
def __str__(self):
return self.name

class Point(models.Model):
player = models.ForeignKey(Player, on_delete=models.PROTECT, related_name='points') # You need to associate the player with the point
val = models.IntegerField()
timestamp = models.DateTimeField()

class Game(models.Model):
slug = models.SlugField(unique=True)
timestamp = models.DateTimeField()
players = models.ManyToManyField(Player, related_name='games')
points = models.ManyToManyField(Point)

现在,例如,要获取玩家所玩的游戏,你可以这样写:

player = Player.objects.get(id=1)
games_played = player.games.count()

或者使用动态属性(此属性不会插入到数据库中,但在每次调用时都会对其进行评估,因此不需要更新它):

class Player(models.Model):
# Your fields and methods
@property
def games_played(self):
return self.games.count()

从文档中获取引用来编写查询。如果你想将团队和游戏关联起来,你可以创建一个额外的表或使用一个泛型关系。

最新更新