Как иметь две модели, ссылки друг на друга Django - программирование
Подтвердить что ты не робот

Как иметь две модели, ссылки друг на друга Django

У меня есть следующий код:

class Game(models.Model):
    title = models.CharField(max_length=50)
    summery = models.CharField(max_length=500)
    key = models.IntegerField()
    pin = models.CharField(max_length=12)
    complete = models.BooleanField()
    invite_sent = models.DateTimeField()
    on = models.ForeignKey(Member, blank = True) #<----


class Member(models.Model):
    email = models.CharField(max_length=100)
    color = models.CharField(max_length=11)
    game = models.ForeignKey(Game) #<----

Внешний ключ "on" связывается с одним из членов (кто его поворачивает). Все участники игры имеют свой "игровой" внешний ключ, установленный в игру, в которой они находятся. Проблема в том, что Django не позволит мне ссылаться на класс до его объявления, и поскольку я не могу объявить их одновременно...

Изменить: Чтобы прояснить ситуацию, вот пример. Если бы в игре участвовало пять человек, у всех пяти были бы внешние ключи к игре. У игры, с другой стороны, был бы один внешний ключ для конкретного участника, который его включил.

4b9b3361

Ответ 1

Документация Django для поля ForeignKey:

Если вам нужно создать отношение к модели, которая еще не определена, вы можете использовать имя модели, а не сам объект модели.

Итак, в вашем случае это будет:

class Game(models.Model):
    # Other fields...
    on = models.ForeignKey('Member', blank = True)

class Member(models.Model):
    # Other fields...
    game = models.ForeignKey(Game)

Ответ 2

Вам не нужно, чтобы две модели ссылались друг на друга с внешними ключами. Удалите строку:

on = models.ForeignKey(Member, blank = True) #<----

и логически ваш Member по-прежнему будет связан с разными Game (и это имеет большее значение, потому что член может принадлежать к одной игре за раз, тогда как игра может иметь более одного члена).

Вы можете использовать обратное отношение, чтобы выяснить, какие члены находятся в конкретной игре.