2011-11-10 80 views
0

我想使用Django管理員允許基本管理頁面菜單。我有一個主菜單,我決定使用子菜單進行擴展,以便在必要時進行下拉菜單。由於子菜單項與主菜單項I具有相同的字段,但使用繼承是一個好主意,因此子菜單將繼承主菜單中的所有字段,並具有外鍵關係,如下所示:Django模型繼承數據保存在這兩個模型

# main menu 
class MainMenu(models.Model): 
    title = models.CharField(max_length=50) 
    url = models.URLField()  

    def __unicode__(self): 
     return self.title 

    class Meta: 
     verbose_name_plural = "Main Menu Items" 

# submenu - for drop downs 
class SubMenu(MainMenu): 
    main_menu = models.ForeignKey(MainMenu, related_name='+', null=True, blank=True) 

    class Meta: 
     verbose_name_plural = "Sub Menu Items" 

我註冊的模型與管理,但是當我在子菜單中保存項目,它不僅進入子菜單它使在主菜單中同一條目。任何ide我做錯了什麼?我是否需要以某種方式告訴Django我繼承了MainMenu的方法而不保存到它?任何幫助非常感謝。

回答

2

但這就是模型繼承的工作原理。 SubMenu與MainMenu具有隱式OneToOne關係,但「inherited」字段實際上屬於MainMenu。

你可以做的是定義一個BaseMenu抽象模型 - 在內部的Meta類中使用abstract = True。現在MainMenu和SubMenu都繼承了它,但SubMenu添加了它的main_menu鏈接。

+0

yeps,這就是繼承在Django中的工作原理。所以你必須選擇最適合你的東西:繼承或外鍵。使用他們兩個只是沒有意義 – juliomalegria

+0

我想我會通過避免創建基類節省一些時間,但實際上它非常快。這絕對是做到這一點的方法。感謝所有有用的輸入! –