Как сохранить экземпляры модели Django с круговой зависимостью? - PullRequest
0 голосов
/ 06 ноября 2018

models.py:

class Server(models.Model):
    name = models.CharField(max_length=100, unique=True)
    last_interaction = models.OneToOneField('Interaction',
                                       on_delete=models.CASCADE,
                                       related_name='server')

class Interaction(models.Model):
    client = models.CharField(max_length=100)
    time = models.DateTimeField()
    server = models.ForeignKey(Server,
                               on_delete=models.CASCADE,
                               related_name="interactions")

Как сохранить экземпляры? (Когда я хочу сохранить один, другой еще не сохранен, поэтому его нельзя сохранить)

Примечания:

  1. Я был там . Принятый ответ не дает решения проблемы. Действительно, во время выполнения появятся новые серверы и клиенты.
  2. Я знаю, что эта схема не имеет большого смысла, но я все еще хочу найти способ работать с этим.
  3. Я знаю, что on_delete=cascade на сервере опасен. Я планирую исправить это, как только решу эту проблему.

1 Ответ

0 голосов
/ 06 ноября 2018

По сути, если вы создаете циклическое отношение внешнего ключа, по крайней мере один из них должен иметь значение NULL. Например:

class Interaction(models.Model):
    client = models.CharField(max_length=100)
    time = models.DateTimeField()
    server = models.ForeignKey(Server,
                               on_delete=models.CASCADE,
                               related_name="interactions",
                               null=True
    )

Вы сможете создавать Interaction объекты, не имея соответствующего экземпляра Server.

...