在保存时创建模型副本的最佳方法是什么?

时间:2017-03-22 08:10:45

标签: python django

我正在创建一个简单的应用程序,它有这两个简单的模型:

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中超出了最大递归深度

另外,我不确定这是否是最好的方法。我应该使用模型管理器来处理这个问题吗?请让我知道最佳解决方案。

0 个答案:

没有答案