Набор запросов Django с рекурсивным «многие ко многим» и отображаемым результатом - PullRequest
0 голосов
/ 20 мая 2019

Я хотел бы получить вашу помощь, чтобы найти решение моей проблемы, обработав поле «многие ко многим» и отобразив результат.

Ожидаемый результат:

У меня есть список версий контента в моем приложении (например, 8-е издание, 9-е издание, 10-е издание ...), и для каждого из них у меня есть список коллекций с подрывной деятельностью (до 9,8, 9,9, 9,10 , всего 10,0, ...).

Я пытаюсь отобразить динамическую навигационную панель, которая содержит вкладки в зависимости от версии контента. Каждая вкладка содержит список подрывных действий.

Вкладка 9-е издание содержит 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. Но в каждой вкладке я получаю список всех подрывных операций или хочу, чтобы для каждой вкладки отображались только связанные подрывные операции.

Мой тест:

Если я напишу этот тест:

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>]>

Но как мне справиться с моим меню для отображения каждой версии вкладки со списком связанных подрывных функций?

Я заблокирован на этом шаге.

Спасибо

1 Ответ

2 голосов
/ 20 мая 2019
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)

Попробуйте этот код. Дайте нам знать, что проблема будет.

...