relazione con una relazione molti a molti Django rapporto?
-
14-10-2019 - |
Domanda
Sono relativamente nuovo a Django e OO, così che io possa mancare qualcosa di ovvio, ma non posso avvolgere la mia testa intorno come modellare il seguente:
-
Ho posizioni.
-
Ho giochi.
Ogni posizione può avere come molti giochi come ha bisogno, e giochi possono essere in più sedi (questi sono giochi come in "monopolio", il titolo del gioco, non è un caso specifico).
Questo è abbastanza semplice per modello con un rapporto 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 ]
Ho anche il consueto modello utente Django.
Ora, quello che sto cercando di aggiungere a questo rapporto è il concetto di punteggi.
Gli utenti dovrebbero essere in grado di inserire i loro punteggi per un gioco situato in una posizione particolare. Dovrei quindi in grado di mostrare, ad esempio, i punteggi migliori 10 per ogni gioco in una posizione, ma anche i primi 10 punteggi a livello globale per un gioco in tutte le sedi.
Quindi, in sostanza ci dovrebbe essere un punteggio legato a un utente, un gioco e una posizione.
Sembra a me come dovrebbe essere un qualche tipo di relazione con la relazione stessa. Ho guardato i campi extra sui rapporti m2m ea modelli intermedi, ma non riesco a trovare un modo per farlo correttamente.
Tutti gli indicatori apprezzato volentieri.
Grazie!
Soluzione
Se si desidera collegare al releationship tra Game & Location è necessario creare modello di intermediario. Ecco un esempio di codice
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. Vorrei rinominare la Game
per GameType
e quindi chiamare GameLocation
semplice un Game
.