如何使用循环依赖项保存Django模型实例?

时间:2018-11-05 21:57:07

标签: django django-models circular-reference

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. 我去过there。接受的答案不能解决问题。实际上,在运行时将会有新的服务器和客户端。
  2. 我知道这种模式没有什么意义,但是我仍然想找到一种处理此模式的方法。
  3. 我知道服务器中的on_delete=cascade很危险。解决此问题后,我计划修复它。

1 个答案:

答案 0 :(得分:0)

从根本上讲,如果创建循环外键关系,则至少其中之一必须是可为空的。例如:

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对象。