Django 如何设计我的模型?

Django 如何设计我的模型?,django,Django,我有个问题。我不知道如何按照Django的公平方式构建我的模型 我有3个模型:团队、平台和游戏 class Team(models.Model): name = models.CharField(max_length=15, null=False) tag = models.CharField(max_length=4, null=False) description = HTMLField(blank=True, null=True) logo = models

我有个问题。我不知道如何按照Django的公平方式构建我的模型

我有3个模型:团队、平台和游戏

class Team(models.Model):
    name = models.CharField(max_length=15, null=False)
    tag = models.CharField(max_length=4, null=False)
    description = HTMLField(blank=True, null=True)
    logo = models.FileField(upload_to=user_directory_path, validators=[validate_file_extension], blank=True, null=True)
    games = models.ManyToManyField(Games, verbose_name="Jeu")
    owner = models.ForeignKey(User, verbose_name="Créateur")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")

class Plateform(models.Model):
    name = models.CharField(max_length=100, unique=True, null=False, verbose_name="Plateforme")
    guid = models.CharField(max_length=100, unique=True, null=False, verbose_name="Abréviation")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")

class Games(models.Model):
    guid = models.CharField(max_length=100, unique=True, null=False, verbose_name="GUID")
    title = models.CharField(max_length=100, null=False, verbose_name="Titre")
    logo = models.FileField(upload_to='media/games/', validators=[validate_file_extension], blank=True, null=True, verbose_name="Logo du jeu")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
    plateform = models.ManyToManyField(Plateform, verbose_name="Plateforme")
因此:

  • 游戏拥有许多平台

  • 球队打很多比赛

我的问题是,如何确定一支球队目前正在哪个平台上进行哪些比赛? 因为我必须知道一支球队是在一个特定的平台上还是在几个平台上进行比赛

我想我需要一门新课,比如:

class Relation(models.Model):
   team = models.ForeignKey(Team)
   plateform = models.ForeignKey(Plateform)
   game = models.ForeignKey(Games)
但据Django说,难道没有更好的办法吗


感谢您的帮助。

您可以在m2m关系中使用额外字段:

您将丢失m2m查询集上的几个可用选项,但它将以适当的方式解决您的问题

您的关系模型应该如下所示:

class Relation(models.Model):
    team = models.ForeignKey(Team)
    game = models.ForeignKey(Games)
    platforms = models.ManyToManyField(Plateform)
在您的
团队中
模型通过添加

class Team(models.Model):
    name = models.CharField(max_length=15, null=False)
    tag = models.CharField(max_length=4, null=False)
    description = HTMLField(blank=True, null=True)
    logo = models.FileField(upload_to=user_directory_path, validators=[validate_file_extension], blank=True, null=True)
    games = models.ManyToManyField(Games, verbose_name="Jeu", through='Relation')
    owner = models.ForeignKey(User, verbose_name="Créateur")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
现在,您可以了解一个团队在玩什么游戏以及他们在什么平台上玩。 示例:

team1 = Team.objects.first()
games = team1.games.all()
for game in games:
    platforms = game.platforms.all()
    for platform in platforms:
        print(platform)
您可以通过其他方式来完成,比如为
关系中的每个平台添加一个字段,等等。。。但一般来说,这是通过使用django提供的特性来实现的。
它们可能是其他的选择,甚至比我的更好,但这是一个可以考虑的选项。

祝您好运

您可以在m2m关系中使用额外字段:

您将丢失m2m查询集上的几个可用选项,但它将以适当的方式解决您的问题

您的关系模型应该如下所示:

class Relation(models.Model):
    team = models.ForeignKey(Team)
    game = models.ForeignKey(Games)
    platforms = models.ManyToManyField(Plateform)
在您的
团队中
模型通过添加

class Team(models.Model):
    name = models.CharField(max_length=15, null=False)
    tag = models.CharField(max_length=4, null=False)
    description = HTMLField(blank=True, null=True)
    logo = models.FileField(upload_to=user_directory_path, validators=[validate_file_extension], blank=True, null=True)
    games = models.ManyToManyField(Games, verbose_name="Jeu", through='Relation')
    owner = models.ForeignKey(User, verbose_name="Créateur")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
现在,您可以了解一个团队在玩什么游戏以及他们在什么平台上玩。 示例:

team1 = Team.objects.first()
games = team1.games.all()
for game in games:
    platforms = game.platforms.all()
    for platform in platforms:
        print(platform)
您可以通过其他方式来完成,比如为
关系中的每个平台添加一个字段,等等。。。但一般来说,这是通过使用django提供的特性来实现的。
它们可能是其他的选择,甚至比我的更好,但这是一个可以考虑的选项。

祝你好运,谢谢。事实上,我认为另一种可能也是最简单的方法,就是在一个平台上添加如此多的游戏时间。我认为这是最简单的方法,因为它可以解决您以后访问数据时需要更少代码的问题。此外,您不会丢失太多django功能。但这是你的选择。你的链接很有趣。如果ManyToManyField.through_fields是这种情况的解决方案,我会试试。谢谢。事实上,我认为另一种可能也是最简单的方法,就是在一个平台上添加如此多的游戏时间。我认为这是最简单的方法,因为它可以解决您以后访问数据时需要更少代码的问题。此外,您不会丢失太多django功能。但这是你的选择。你的链接很有趣。如果ManyToManyField.through_fields是这种情况的解决方案,我会试试。