Python Django queryset,具有递归多对多并显示结果
我希望得到您的帮助,以便通过处理多对多字段和显示结果来找到我的问题的解决方案 预期结果: 我的应用程序中有一个内容版本列表(例如:第8版、第9版、第10版…),对于每一个版本,我都有一个包含subversion的集合列表(toto 9.8、toto 9.9、toto 9.10、toto 10.0等) 我试图显示一个动态导航栏,其中包含根据内容版本的选项卡。每个选项卡都包含颠覆列表 第九版包含9.8、9.9、9.10、 标签10版包含10.0,… ----------- 我的型号: 我有一个模型文件,它有:Python Django queryset,具有递归多对多并显示结果,python,django,django-models,django-views,django-orm,Python,Django,Django Models,Django Views,Django Orm,我希望得到您的帮助,以便通过处理多对多字段和显示结果来找到我的问题的解决方案 预期结果: 我的应用程序中有一个内容版本列表(例如:第8版、第9版、第10版…),对于每一个版本,我都有一个包含subversion的集合列表(toto 9.8、toto 9.9、toto 9.10、toto 10.0等) 我试图显示一个动态导航栏,其中包含根据内容版本的选项卡。每个选项卡都包含颠覆列表 第九版包含9.8、9.9、9.10、 标签10版包含10.0,… ----------- 我的型号: 我有一个模型文
class NavbarMenuSettings(models.Model):
""" A class to manage navbar menu of the application """
collection = models.ManyToManyField('publication.Collection', related_name='collection_list', symmetrical=False)
application = models.ForeignKey('publication.WebApplication', verbose_name=_('application'), related_name='application', on_delete=models.CASCADE)
title = models.CharField(max_length=30, verbose_name=_('title'), default=('Xth Edition (Current)'))
order = models.PositiveSmallIntegerField(default=1, verbose_name=_('menu order'), blank=True, null=False)
display = models.BooleanField(verbose_name=_('Display menu'), default=True)
class Meta:
verbose_name = _('menu setting')
verbose_name_plural = _('menu settings')
我有一个menu.py文件,用于处理导航栏:
def list_of_edition():
""" Return list of editions """
instance = NavbarMenuSettings.objects.filter(display=True).order_by('order')
return instance
edition_children = ()
for instance in list_of_edition():
edition_children += MenuItem(instance.collection.all(), reverse('home'), weight=150, separator=False),
for instance in list_of_edition():
Menu.add_item('edition', MenuItem(instance.title, '#', children=edition_children))
我想让它充满活力。它为显示的每个NavbarMenuSettings对象创建一个新选项卡。但在每个选项卡中,我都会得到所有subversion的列表,或者我只想为每个选项卡显示关联的subversion
我的测试:
如果我编写此测试:
for element in list_of_edition():
print(element.title)
print(element.collection.all())
它显示:
10th Edition (Current)
<QuerySet [<Collection: 10.0 lite>]>
9th Edition
<QuerySet [<Collection: 9.8 lite>, <Collection: 9.9 lite>, <Collection: 9.10 lite>]>
10版(当前版本)
第九版
但是我如何处理我的菜单以显示每个选项卡版本以及相关的子版本列表呢
我被挡在这一步上了
多谢各位
from collections import OrderedDict
od = OrderedDict()
for version in list_of_edition():
#print(element.title)
#print(element.collection.all())
od.setdefault((version.pk, version.title) []).extend([(subversion.pk, subversion.title) for subversion in version.collection.all()])
print(od)
试试这个代码。让我们知道会有什么问题
试试这个代码。让我们知道会出现什么问题。你想在模板中显示这个吗?@gd8你是对的,但目前,我无法克服显示具有良好颠覆性的选项卡。在公共收藏模型中有9.1、9.2版本?不是强制性的,第9版包含9.X开始的版本,第10版包含10.X开始的版本。但可能是Y.1,Y.12,颠覆。我没有克服的是将Subversion分组到好的版本并显示在每个版本选项卡上,只显示相关的Subversion。我的意思是?你怎么知道9.1、9.2、9.3是对9的颠覆?如何在数据库级别创建它们?您有NavbarMenuSettings模型,但集合模型呢?它们是用来做什么的?你想在模板中显示这个吗?@gd8你是对的,但目前,我没有克服显示具有良好颠覆性的选项卡的困难。在公共收藏模型中有9.1、9.2版本?不是强制性的,第9版包含从9.X开始的版本,第10版包含从10.X开始的版本。但可能是Y.1,Y.12,颠覆。我没有克服的是将Subversion分组到好的版本并显示在每个版本选项卡上,只显示相关的Subversion。我的意思是?你怎么知道9.1、9.2、9.3是对9的颠覆?如何在数据库级别创建它们?您有NavbarMenuSettings模型,但集合模型呢?它们用于什么?它显示
OrderedDict([(2[58464]),(1[2192829235,36542]))
,似乎将subversions id分组到正确的版本id。现在,我们必须看看如何通过添加标题来重写菜单选项卡。我更新了答案。。。请告诉我您的问题是否已解决。结果如预期,但我如何将您的代码集成到菜单。添加项目和菜单项,以显示我的导航栏?此案例标记为已解决,,,您的确切意思是什么?你想在你的html模板中显示这个吗?我不知道你的菜单和菜单项是什么,,,我会告诉你你需要什么。在视图函数中,使用django模板语言呈现模板并传递变量(od)并迭代模板中的od变量。它显示OrderedDict([(2,[58464]),(1,[2192829235,36542]))
,似乎将subversions id分组到正确的版本id。现在,我们必须看看如何通过添加标题来重写菜单选项卡。例如,我更新了答案。。。请告诉我您的问题是否已解决。结果如预期,但我如何将您的代码集成到菜单。添加项目和菜单项,以显示我的导航栏?此案例标记为已解决,,,您的确切意思是什么?你想在你的html模板中显示这个吗?我不知道你的菜单和菜单项是什么,,,我会告诉你你需要什么。在视图函数中,使用django模板语言渲染模板并传递变量(od)并迭代模板中的od变量。