Django onetomany查询

Django onetomany查询,django,Django,首先,感谢所有花时间回答这个问题的人。我对Django非常陌生,编程只是学习了几个月 我在这个论坛上搜索了一些类似于这个查询的内容,并快速阅读了Django中的聚合,试图解决这个问题。我把自己弄糊涂了,所以我想我应该试着问这个问题,因为它让我发疯 一个非常简短的概述我正在努力实现的目标。我正在为我的网站创建菜单系统,但这是通过数据库完成的,因此用户可以动态添加/删除网站菜单。我创建了两个模型,其中一个是onetomany关系,涵盖了站点导航的主菜单和子菜单元素 class Menu(models

首先,感谢所有花时间回答这个问题的人。我对Django非常陌生,编程只是学习了几个月

我在这个论坛上搜索了一些类似于这个查询的内容,并快速阅读了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

因此,我创建了一个主菜单表,其中包含主页、联系我们、链接和类。子菜单将舞蹈课程链接到课程,体操课程也链接到课程

现在,我正在努力研究如何高效地查询这两个表以创建一个数据集,以便迭代生成菜单。也就是说,它需要创建一个数据集,如下所示,使用菜单位置对数据集的元素进行排序

菜单,课程,舞蹈课,体操课,联系我们,链接

在我看来,我的尝试如下:通过两个helper函数来创建数据集

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
这不起作用,因为我不太清楚它在菜单id中实际使用了什么来引用到主菜单的正确链接。我想,一旦我解决了这个问题,它就会起作用,但我觉得有一种更简单的方法,我可能还没有读过

谢谢你的帮助。请记住,我在这方面很新,所以如果你能尝试在你的回复中提供一些解释,我将非常感激

问候


韦恩

很高兴看到你开始编程,看起来不错

您可以看到,Django自动向父模型添加一个附加属性,在您的情况下,它将是访问相关元素的菜单模型。你可以

这样,如果您有某个菜单实例,您可以使用以下命令访问相关的子菜单:

my_menu.sub_menu_set.all()

您甚至可以在模板中直接使用它,尽管这不是最好的性能方面的想法,但它是有效的

感谢@Joséu Tomás_Tocino花时间回复。我尝试应用那些似乎有效的方法,但却在努力找出如何最好地存储返回的数据,以及如何在模板中访问这些数据。我想我可以重新编写它,以使用单一模型,而不是使循环更容易。这些数据集现在让我感到困惑,所以我认为我需要重新阅读python数据集。当然,我会像你说的那样,使用一个表示顶级和子菜单项的单一模型。顶层元素将是那些没有父元素的元素。这样比较容易。在这种情况下,您也可以使用我提出的解决方案,它也很有效。顺便说一句,如果你愿意,你可以将答案标记为已接受☺再次感谢您的回复@Jose_Tomas_Tocino。如果可以的话,还有一个简短的问题。我已经使用上面的命令返回了数据。你能解释一下我如何获取这些信息吗?当我查询它时,我得到[]。其中舞蹈课是课程的子菜单。难以通过此数据结构访问子菜单模型属性。谢谢。嗯,我意识到你已经把外键的相关名称设置改成了名字,一个相当糟糕的名字。在这种情况下,您需要使用menu.name.all。检查此项:再次感谢您的友好回复。我的最后一个问题,然后我就不打扰你了。你能告诉我为什么这个名字对我来说是个坏名字吗。另外,您共享的代码是基于我的模型还是基于构建菜单/子菜单的不同模型?提前谢谢,非常感谢,朋友。
my_menu.sub_menu_set.all()