Pregunta

Soy relativamente nuevo en Django y OO, así que puede estar perdiendo algo obvio, pero no puedo envolver mi cabeza alrededor de cómo modelar la siguiente:

  • Tengo ubicaciones.

  • Tengo juegos.

Cada ubicación puede tener tantos juegos como sea necesario, y juegos puede estar en varios lugares (estos son los juegos como en el "monopolio", el título del juego, no una instancia específica).

Esto es bastante simple de modelo con una relación 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 ]

También tiene el modelo de usuario habitual de Django.

Ahora, lo que estoy tratando de añadir a esta relación es el concepto de las puntuaciones.

Los usuarios deben ser capaces de entrar en sus puntuaciones para un juego situado en un lugar determinado. Debería entonces ser capaz de mostrar, por ejemplo, los 10 mejores puntuaciones de cada juego en un lugar, sino también los 10 mejores puntajes a nivel mundial para un juego en todas las ubicaciones.

Así que, básicamente, no debería ser un marcador relacionado con un usuario, un juego y un lugar.

A mi me parece que debería haber algún tipo de relación con la relación misma. Miré a campos adicionales en las relaciones M2M y en modelos intermedios, pero no puedo encontrar una manera de hacer esto correctamente.

Cualquier punteros gusto apreciada.

Gracias!

¿Fue útil?

Solución

Si desea vincular a la releationship entre el juego y la ubicación que necesita para crear el modelo intermediario. Aquí hay un código de ejemplo

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)

Por cierto. Me gustaría cambiar el nombre de Game a GameType y luego llamar a un GameLocation sencilla Game.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top