Django:在保存覆盖中创建和保存另一个模型

Django:在保存覆盖中创建和保存另一个模型,django,Django,我有三个模型:节点、链接和路径。链接是两个节点之间的关系,路径是节点列表。我试图覆盖路径保存函数,以便在路径中的所有相邻节点之间创建链接。我在路径模型中编写了一个add_link函数,并在路径模型中的save函数中为所有相邻对调用它。虽然路径保存正确,并且我可以使用控制台中的add_link函数创建链接,但它们不是在Path的save函数中创建的。我错过了什么 以下是模型: class Node(models.Model): title = models.CharField(max_le

我有三个模型:节点、链接和路径。链接是两个节点之间的关系,路径是节点列表。我试图覆盖路径保存函数,以便在路径中的所有相邻节点之间创建链接。我在路径模型中编写了一个add_link函数,并在路径模型中的save函数中为所有相邻对调用它。虽然路径保存正确,并且我可以使用控制台中的add_link函数创建链接,但它们不是在Path的save函数中创建的。我错过了什么

以下是模型:

class Node(models.Model):
    title = models.CharField(max_length=200, blank=True)
    links = models.ManyToManyField('self', through='Link',
                                           symmetrical=False,
                                           related_name='related_to+')
    def add_link(self, other, symm=True):
        link, created = Link.objects.get_or_create(
            from_node=self,
            to_node=other)
        if symm:
            # avoid recursion by passing `symm=False`
            other.add_link(self, False)
        return link

class Link(models.Model):
    from_node = models.ForeignKey(Node, related_name="from")
    to_node = models.ForeignKey(Node, related_name="to")

class Path(models.Model):
    nodes = models.ManyToManyField(Node, related_name="nodes",through='PathNodeRelationship')

    def save(self, *args, **kwargs):
        super(Path, self).save(*args, **kwargs)

        # save all not-existent links on this path
        nodes = self.nodes.all()
        if nodes:
            f = nodes[0]
            i = 1
            while i < len(nodes):
                s = nodes[i]

                f.add_link(s)
                f = s
                i += 1

class PathNodeRelationship(models.Model):
    node = models.ForeignKey(Node)
    path = models.ForeignKey(Path)
    order_index = models.IntegerField()

第二次编辑:看起来大约3-4年前,这是与admin m2m一起使用的,它有一些黑客修复程序。。。不过,我还没有发现现在是否有更好的方法。

我不确定你会出什么问题,因为当我测试你的代码时,它是有效的

无论如何,有一个建议是让这段代码更优雅一点

    def save(self, *args, **kwargs):
        super(Path, self).save(*args, **kwargs)

        # save all not-existent links on this path
        previous_node = None
        for node in self.nodes.all():
            if previous_node is not None:
                previous_node.add_link(node)
            previous_node = node
这是我通过shell运行的一个测试

>>> Link.objects.all()
[]
>>> path = Path.objects.get(id=2)
>>> path.save()
>>> Link.objects.all()
[<Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>]
>Link.objects.all()
[]
>>>path=path.objects.get(id=2)
>>>path.save()
>>>Link.objects.all()
[, , , ]

如您所见,在对设置了一些PathNodeRelationships的Path对象运行save之后,链接对象从空列表变为填充对象。

您好,谢谢您的帮助!你说得对,当我调用path.save()时,它确实在shell中工作——当我从admin保存时,它似乎只是没有保存链接。知道为什么吗?管理员不调用save函数是出于某种原因吗?
>>> Link.objects.all()
[]
>>> path = Path.objects.get(id=2)
>>> path.save()
>>> Link.objects.all()
[<Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>, <Link: Link object>]