2017-08-24 47 views
1

我有一个问题。我不知道如何根据Django公平的方式来构建我的模型。如何设计我的模型?

我有3个模型:Team,Plateform和Games。

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

所以:

  • 游戏拥有许多Plateforms

  • 队玩很多游戏

我的问题是,如何确定哪些游戏这Plateforms一球队目前正在打球吗? 因为我必须知道一个团队是否在特定的Plateform或几个平台上玩游戏。

我想我需要一个像一个新的类:

class Relation(models.Model): 
    team = models.ForeignKey(Team) 
    plateform = models.ForeignKey(Plateform) 
    game = models.ForeignKey(Games) 

但是是不是有根据Django的一个更好的主意吗?

感谢您的帮助。

回答

0

可以在M2M关于使用额外的字段:

Many to Many - Extra fields doc

你将失去​​你的M2M查询集提供几个选项,但它会以适当的方式解决问题。

你们的关系模式应该是这样的:

class Relation(models.Model): 
    team = models.ForeignKey(Team) 
    game = models.ForeignKey(Games) 
    platforms = models.ManyToManyField(Plateform) 

,并在您Team模型添加through

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) 

你能做到像你Relation模型和等添加一个字段为每个平台等方式......但总的来说这一点,你可以通过使用的功能做到这一点的方式, django提供。 他们可能是其他选择,甚至比我更好,但这是一个选择考虑。

好运

+0

谢谢。事实上,我认为其他的可能性并且可能是最简单的,就是在平台上添加这么多的游戏。 – GrandGTO

+0

我认为这是最简单的方法,因为它会解决您稍后访问数据时遇到的问题,而您需要的代码较少。你也不会失去很多Django功能。但这是你的选择。 – Navid2zp

+0

你的链接很有趣。如果ManyToManyField.through_fields是这种情况的解决方案,我会尝试。 – GrandGTO