2014-12-02 92 views
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 ......我還沒有發現,如果有更好的東西現在雖然。

回答

3

我不確定你會發生什麼問題,因爲當我測試你的代碼時,它可以工作。

對於它的價值,一個建議,雖然是使這個代碼更優雅......

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>] 

正如你所見,鏈接對象從一個空列表開始,在針對PathNodeRelationships設置的Path對象運行保存後被填充。

+0

嗨,謝謝你的幫助!你是對的,當我調用path.save()時,它在shell中工作 - 當我從管理員保存時,它似乎只是不保存鏈接。任何想法爲什麼 - 管理員不會因爲某種原因調用保存功能? – user3234309 2014-12-02 20:06:17

相關問題