2
我有三種模型:節點,鏈接和路徑。鏈接是兩個節點之間的關係,路徑是節點列表。我試圖覆蓋路徑保存功能來創建路徑中所有相鄰節點之間的鏈接。我在Path模型中編寫了一個add_link函數,並在路徑模型的save函數中爲所有相鄰的對調用它。雖然Path正常保存,並且我可以使用控制檯中的add_link函數創建鏈接,但它們不會在Path的保存功能中創建。我錯過了什麼?Django:在保存覆蓋中創建並保存另一個模型
下面是型號:
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()
**編輯:調用path.save()在控制檯時創建的鏈接,但他們使用的管理界面時,不行。這是我做管理員的方式。 **
class NodeInline(admin.TabularInline):
model = Path.nodes.through
extra = 1
class PathAdmin(admin.ModelAdmin):
inlines = (NodeInline,)
admin.site.register(Path, PathAdmin)
2日編輯:看起來大約3-4年前,這是an issue與具有一定哈克修復管理M2M ......我還沒有發現,如果有更好的東西現在雖然。
嗨,謝謝你的幫助!你是對的,當我調用path.save()時,它在shell中工作 - 當我從管理員保存時,它似乎只是不保存鏈接。任何想法爲什麼 - 管理員不會因爲某種原因調用保存功能? – user3234309 2014-12-02 20:06:17