Django OneToOneField Structure

Я исследовал и просмотрел все документы, но я все еще немного запутался, я думаю, может быть потому, что есть несколько способов использовать OnToOneField.

У меня есть 4 модели, Pregame, Ingame, Postgame и Game. И я хочу, чтобы 'Game' содержала остальные три модели.

На данный момент это выглядит следующим образом...

    class Pregame(models.Model):
        game_id = models.CharField(max_length=10)
        other fields...

        def __str__(self):
            return str(self.game_id)

    class Ingame(models.Model):
        game_id = models.CharField(max_length=10)
        other fields...

        def __str__(self):
            return str(self.game_id)

    class Postgame(models.Model):
        game_id = models.CharField(max_length=10)
        other fields...

        def __str__(self):
            return str(self.game_id)

    class Game(models.Model):
        game_id = models.CharField(max_length=10)
        pregame = models.OneToOneField(
            Pregame, on_delete=models.CASCADE, null=True)
        ingame = models.OneToOneField(
            Ingame, on_delete=models.CASCADE, null=True)
        postgame = models.OneToOneField(
            Postgame, on_delete=models.CASCADE, null=True)

        def __str__(self):
            return str(self.game_id)

Я использую OnToOne, потому что в каждой игре будет только один Pregame, Ingame и Postgame, а остальные три модели будут принадлежать только одной игре.

У меня есть пара вопросов, в которых я запутался.

Смогу ли я иметь объект Game, если один из других объектов модели еще не существует? Например, если есть Pregame, но нет Ingame или Postgame, будет ли Game все еще существовать с одним Pregame внутри него? Я видел пару видео, где они делали default='{}', это то, что я должен делать?

У каждой модели есть game_id, и именно так я связываю их все вместе в объект 'Game'. Существует ли опция OneToOneField типа game_id=game_id, чтобы модель 'Game' автоматически связывала все модели вместе или мне все равно придется делать это отдельно?

Спасибо за помощь и знания.

Прежде всего, вам не нужно устанавливать game_id на *игровые сущности. Вы можете просто добавить related_name:

class Game(models.Model):
    game_id = models.CharField(max_length=10)
    pregame = models.OneToOneField(
        Pregame, on_delete=models.CASCADE, null=True, related_name="game")
    ingame = models.OneToOneField(
        Ingame, on_delete=models.CASCADE, null=True, related_name="game")
    postgame = models.OneToOneField(
        Postgame, on_delete=models.CASCADE, null=True, related_name="game")

class Pregame(models.Model):
    other fields...

    def __str__(self):
        return str(self.game_id)

Смогу ли я иметь объект Game, если один из других объектов модели еще не существует? Например, если есть Pregame, но нет Ingame или Postgame, будет ли Game существовать, если внутри него будет только Pregame? Я видел пару видео, где они делали default='{}', это то, что я должен делать?

Да, объект Game может существовать даже без *game, поскольку вы добавили null=True. Вы должны использовать значение по умолчанию, когда ваша модель не принимает нулевые/пустые значения.

У каждой модели есть game_id, и именно так я соединяю их всех вместе в объект "Игра". Есть ли опция OneToOneField типа game_id=game_id, чтобы модель 'Game' автоматически связала все или мне все равно придется делать это отдельно?

Создав такую модель, вы получаете доступ через сущность Game. Например, из перехода pregame в postgame:

postgame = pregame.game.postgame
Вернуться на верх