首先,感谢任何花时间回答这个问题的人。我对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。我认为一旦我解决了这个问题,它就会起作用,但我觉得有一种更简单的方法可以做到这一点,但我现在还没有读到。
感谢您的任何帮助。请记住,我对此非常感兴趣,所以如果您可以尝试在您的回复中提供一些解释,我将非常感激。
问候
韦恩
谢谢@José_Tomás_Tocino抽空回复。我试图应用这似乎工作,但努力找出如何最好地存储回来的数据以及如何在模板中访问它。 我想我可能会重新编写它来利用单一模型来改变循环。目前数据集令我感到困惑,因此我想我需要重新读取python数据集。 – Smurf
当然,我会像你说的那样使用代表顶级和子菜单项的单一模型。顶级元素将是没有父级的元素。这样更容易。在这种情况下,你也可以使用我提出的解决方案,它也可以。顺便说一句,你可以将答案标记为接受,如果你觉得它☺ –
感谢再次@ Jose_Tomas_Tocino的答复。如果我可以,另一个快速问题。我已经使用上面的命令来返回数据。你能解释我如何获取信息吗?当我查询它时,我得到[]。 “舞蹈班”是课程的子菜单。努力通过这个数据结构来访问sub_menu模型的属性。谢谢。 –
Smurf