Отношение с Джанго много со многими отношениями?

StackOverflow https://stackoverflow.com/questions/4580072

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top