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

2024-05-20 00:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一款游戏设计一个基于Django的网络界面,该游戏既可以单人玩,也可以团队玩。游戏是以分数为基础的;达到设定点数的第一方获胜。对于以后的统计和显示,点具有时间戳

我的问题是:如何在一个Game中有两个Player或两个Team?我的模特现在看起来像这样:

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,但同样的问题也适用于那里。像赢和输这样的冗余领域也是我不喜欢的

期待您的反馈


1条回答
网友
1楼 · 发布于 2024-05-20 00:39:08

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

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()

要编写查询,请从documentation引用。如果您还想将团队与游戏关联,可以创建一个附加表或使用generic relation

相关问题 更多 >