Отношение с Джанго много со многими отношениями?
-
14-10-2019 - |
Вопрос
Я относительно новичок в Django и OO, поэтому я могу упустить что -то очевидное, но я не могу обернуть голову, как моделировать следующее:
У меня есть места.
У меня есть игры.
Каждое место может иметь столько игр, сколько нужно, а игры могут быть в нескольких местах (это игры, как в «Монополии», название игры, а не в конкретном случае).
Это достаточно просто для моделирования с отношениями 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 ]
У меня также есть обычная модель пользователя Django.
Теперь, что я пытаюсь добавить к этим отношениям, - это концепция результатов.
Пользователи должны иметь возможность ввести свои результаты для игры, расположенной в определенном месте. Затем я должен быть в состоянии показать, скажем, 10 лучших результатов для каждой игры в месте, но также и 10 лучших результатов по всему миру для игры во всех местах.
Таким образом, в основном должен быть счет, связанный с пользователем, игрой и местоположением.
Мне кажется, что это должно быть каким -то отношениям с самими отношениями. Я посмотрел на дополнительные поля на отношениях 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, 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)
Кстати. Я бы переименовал твой Game
к GameType
а затем позвоните GameLocation
простой а Game
.