2015-07-10 72 views
0

首先,感謝任何花時間回答這個問題的人。我對Django和Programming非常陌生(僅僅學習了幾個月)。Django onetomany查詢

我在這個論壇搜索了一些類似於這個查詢的內容,並且在Django中快速閱讀了聚合以嘗試解決這個問題。我讓自己感到困惑,所以我想試着問這個問題,因爲它讓我發瘋。

我想要實現的內容的簡要概述。我正在爲我的網站創建菜單系統,但是通過數據庫執行此操作,以便用戶可以動態地添加/刪除網站菜單。我已經創建了兩個模型(帶有onetomany關係)來覆蓋站點導航的主菜單和子菜單元素。

class Menu(models.Model): 
    menu_name = models.CharField(max_length=25, verbose_name="Menu Name") 
    urlconf_name = models.CharField(max_length=25, verbose_name="URLConf Name") 
    menu_position = models.IntegerField(verbose_name="Menu Position", unique=True) 
    has_sub_menu = models.BooleanField(default=False, verbose_name="Sub Menu Linked") 
    active = models.BooleanField(default=True, verbose_name="Menu Active") 

    def __str__(self): 
     return self.name 

class Sub_Menu(models.Model): 
    sub_name = models.CharField(max_length=25, verbose_name="Sub Menu Name") 
    urlconf_name = models.CharField(max_length=25, verbose_name="Sub Menu URLConf Name") 
    menu_position = models.IntegerField(verbose_name="Sub Menu Position") 
    menu_id = models.ForeignKey(Menu, related_name="name") 

所以,我創建了一個主菜單表 「主頁」, 「聯繫我們」, 「鏈接」 和 「類」。子菜單中有與「課程」相關的「課程」和「體操課程」相關的「舞蹈課程」。

現在,我正在努力研究如何有效地查詢這兩個表來創建一個單一的數據集,所以我可以遍歷這個來生成菜單。 I.E.它需要創建一個數據集如下(使用「菜單位置」來訂購數據集的元素)

菜單,班級,舞蹈班,體操班,聯繫我們,鏈接。

我的嘗試如下在我的視圖中通過兩個輔助函數來創建數據集。

def get_menu(): 
    try: 
     main_menu = Menu.objects.all().order_by('menu_position') 
     return main_menu 
    except ObjectDoesNotExist: 
     return None 

def get_submenu(main_menu): 
    submenu_dict = [] 
    for menu in main_menu: 
     sub_menu = Sub_Menu.objects.filter(menu_id=menu.main_name).order_by('menu_position') 
     submenu_dict.append(sub_menu) 
     # pdb.set_trace() 
    return submenu_dict 

這不工作,因爲我已經不能完全制定出什麼樣的實際使用中menu_id引用正確鏈接MAIN_MENU。我認爲一旦我解決了這個問題,它就會起作用,但我覺得有一種更簡單的方法可以做到這一點,但我現在還沒有讀到。

感謝您的任何幫助。請記住,我對此非常感興趣,所以如果您可以嘗試在您的回覆中提供一些解釋,我將非常感激。

問候

韋恩

回答

0

很高興見到你開始寫頻,它看起來不錯。

你看,Django的ForeignKey會自動添加一個額外的屬性添加到「父」模型(在你的情況下,它會是Menu模型)來訪問相關內容。你可以read about it here

這樣,如果你有一定的Menu比如,你可以通過訪問相關Sub_Menu S:

my_menu.sub_menu_set.all() 

你甚至可以直接在模板中使用,雖然它不是最好的主意性能 - 明智的,但它的作品。

+0

謝謝@José_Tomás_Tocino抽空回覆。我試圖應用這似乎工作,但努力找出如何最好地存儲回來的數據以及如何在模板中訪問它。 我想我可能會重新編寫它來利用單一模型來改變循環。目前數據集令我感到困惑,因此我想我需要重新讀取python數據集。 – Smurf

+0

當然,我會像你說的那樣使用代表頂級和子菜單項的單一模型。頂級元素將是沒有父級的元素。這樣更容易。在這種情況下,你也可以使用我提出的解決方案,它也可以。順便說一句,你可以將答案標記爲接受,如果你覺得它☺ –

+0

感謝再次@ Jose_Tomas_Tocino的答覆。如果我可以,另一個快速問題。我已經使用上面的命令來返回數據。你能解釋我如何獲取信息嗎?當我查詢它時,我得到[]。 「舞蹈班」是課程的子菜單。努力通過這個數據結構來訪問sub_menu模型的屬性。謝謝。 – Smurf