我正在创建一个简单的应用程序,它有这两个简单的模型:
from django.db import models
from django.core.exceptions import ValidationError, ObjectDoesNotExist
class Node(models.Model):
title = models.CharField(max_length=50)
def __str__(self):
return "{}".format(self.title)
class Path(models.Model):
class Meta:
unique_together = ['from_node', 'to_node']
from_node = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='from_node')
to_node = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='to_node')
distance = models.DecimalField(max_digits=19, decimal_places=2)
def __str__(self):
return '{0} to {1}'.format(self.from_node, self.to_node)
def clean(self):
if self.from_node == self.to_node:
raise ValidationError("From and to Nodes must be different ")
到目前为止一直很好......
不,我想要的是创建和管理路径模型的另一个镜像副本,如下所示:
假设我们有3个节点" A"," B"," C" 当用户从A& A创建路径时B我还想创建另一个从B到A的镜像路径,它也具有相同的距离。
所以我将这个保存方法添加到我的Path模型中:
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
super(Path, self).save(force_insert, force_update, using, update_fields)
try:
mirror_path = Path.objects.get(from_node=self.to_node, to_node=self.from_node)
if not self._state.adding:
mirror_path.distance = self.distance
mirror_path.save()
except ObjectDoesNotExist:
Path.objects.create(from_node=self.to_node, to_node=self.from_node, distance=self.distance)
所以现在当创建一个新路径时,还会创建一个镜像路径,但是当更新任何现有路径时,会有一个递归,因为这两个模型一直在调用另一个保存方法,我得到错误:
cmp中超出了最大递归深度
另外,我不确定这是否是最好的方法。我应该使用模型管理器来处理这个问题吗?请让我知道最佳解决方案。