Django:如何从与用户相关的子查询集中获得一个独特的父列表?

这些是我的模型,其中Apps具有menu_items:


class App(models.Model):

    name = models.CharField(max_length=50)


class Menu(models.Model):

    name = models.CharField(max_length=120)

    app = models.ForeignKey(App, on_delete=models.PROTECT)

    url = models.CharField(max_length=120, null=True)


    class Meta:

        ordering = ['name', 'app']

这是我的观点,有什么方法可以对其进行优化?


class AboutView(TemplateView):

    template_name = 'about.html'


    def get_context_data(self, *args, **kwargs):

        context = super(AboutView, self).get_context_data(*args, **kwargs)

        menu_items = Access.objects.filter(user__id=self.request.user.id)

        applist = []

        for m in menu_items:

            applist.append(m.menu.app.name)

        apps = App.objects.filter(name__in=applist)

        context = {

            "menu_items": menu_items,

            "apps": apps

        }

        return context

这是我的模板,我重新排列了每个应用程序下的menu_items。


<ul class="navbar-nav ml-auto">

                {% for app in apps %}

                    <li class="nav-item dropdown">

                        <a class="nav-link" href="#" id="appMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

                            {{ app.name }}

                        </a>

                        <div class="dropdown-menu dropdown-menu-left" aria-labelledby="appMenu">

                            {% for item in menu_items %}

                                {% if item.menu.app.name == app.name %}

                                    <a class="dropdown-item" href="{{ item.menu.url }}">{{ item.menu.name }}</a>

                                    {# href="{{ item.menu.url }} #}

                                {% endif %}

                            {% endfor %}

                        </div>

                    </li>

                {% endfor %}

            </ul>

我希望有一个更好的方法来做到这一点。先感谢您。根据要求,这是访问模型


class Access(models.Model):

    menu = models.ForeignKey(Menu, on_delete=models.PROTECT)

    user = models.ForeignKey(User, on_delete=models.PROTECT)


慕勒3428872
浏览 139回答 2
2回答

饮歌长啸

我不会写一个完整的答案,因为我没有足够的时间并且无法立即测试代码。但是无论如何:您正在寻找的功能是:查找跨越关系的关系(另请参见关于多值关系的部分)相关描述符prefetch_related和Prefetch对象结合所有这些功能应该可以解决您的问题。唯一的警告是Prefetch使用到目前为止我从未使用过的对象过滤菜单项,因此我无法确定它是否可以按预期工作。

MMMHUHU

这可以删除app_list和“ for循环”apps&nbsp;=&nbsp;App.objects.filter(menu__name=F('menu'))@bruno desthuilliers,我仍在尝试了解预取
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python