2011-01-02 4 views
1

Je suis relativement nouveau à Django et OO, donc je peut manquer quelque chose évidente, mais je ne peux pas envelopper la tête autour de la façon de modéliser les éléments suivants:relation à un Django plusieurs à plusieurs relation?

  • Je endroits.

  • J'ai des jeux.

Chaque emplacement peut avoir autant de jeux dont il a besoin, et des jeux peut être à plusieurs endroits (ce sont des jeux comme dans « monopole », le titre du jeu, et non une instance).

Ceci est assez simple pour modéliser une relation m2m:

class Location(models.Model): 
    name = models.CharField(max_length=300) 
    city = models.CharField(max_length=300) 
    [ etc etc ] 
    games = models.ManyToManyField('Game', related_name='locations', blank=True) 


class Game(models.Model): 
    name = models.CharField(max_length=300) 
    manufacturers = models.ForeignKey('Manufacturer') 
    [ etc etc ] 

J'ai aussi le modèle habituel de l'utilisateur Django. Maintenant, ce que j'essaie d'ajouter à cette relation est le concept de scores.

Les utilisateurs doivent pouvoir entrer leurs scores pour un jeu situé dans un endroit particulier. Je devrais alors être en mesure de montrer, disons, les 10 meilleurs scores pour chaque jeu dans un endroit, mais aussi les 10 meilleurs scores au niveau mondial pour un jeu à travers tous les emplacements. Donc, fondamentalement, il devrait y avoir un score lié à un utilisateur, un jeu et un emplacement.

Il me semble que ce devrait être un certain type de relation avec la relation elle-même. J'ai regardé des champs supplémentaires sur les relations m2m et sur les modèles intermédiaires, mais je n'arrive pas à trouver un moyen de le faire correctement.

Tous les pointeurs apprécié avec plaisir.

Merci!

Répondre

1

Si vous voulez mettre en lien avec la relation entre le jeu & Vous devez créer un modèle intermédiaire. Voici un exemple de code

class Location(models.Model): 
    name = models.CharField(max_length=300) 
    city = models.CharField(max_length=300) 
    [ etc etc ] 
    games = models.ManyToManyField('Game', related_name='locations', blank=True, through='GameLocation') 


class Game(models.Model): 
    name = models.CharField(max_length=300) 
    manufacturers = models.ForeignKey('Manufacturer') 
    [ etc etc ] 

class GameLocation(models.Model): 
    game = models.ForeignKey(Game) 
    location = models.ForeignKey(Location) 
    # some other filed like for example date 

class Score(models.Model): 
    user = models.ForeginKey('user') 
    gamelocation = models.ForeginKey('GameLocation') 
    score = models.DecimalField(max_digits=5, decimal_places=2) 

btw. Je renomme votre Game en GameType et puis appelle GameLocation simple un Game.

+0

Merci, c'est exactement ce dont j'avais besoin. Je tournais autour de la bonne zone, vous l'avez rendu agréable et clair. Parfait. – Zoom

Questions connexes