2015-07-10 46 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