Django:如何从与用户相关的子查询集中获取不同的父列表?

Posted

技术标签:

【中文标题】Django:如何从与用户相关的子查询集中获取不同的父列表?【英文标题】:Django: How to get a distinct Parent List from a Child Queryset related to the User? 【发布时间】:2018-12-01 13:46:56 【问题描述】:

这些是我的应用程序有 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)

【问题讨论】:

如果我们不知道您想要什么,也不知道您的代码有什么问题,我们该如何回答? 我正在尝试在作为上下文传递之前优化对 menu_items 和应用程序的查询。我认为有一种方法可以在较短的行中获取查询,例如 apps = App.objects.filter(name__in=menu_items.apps) 而不是执行 forloop 和 queryset 组合。 您是如何在模板中实际使用menu_itemsapps 的?如果您的模板代码正在按应用程序重新组合菜单,那么是的,确实有一种更好、更简单的方法。否则请说明您如何使用应用程序和菜单。 我编辑了我的帖子添加了模板,感谢您的支持 能否添加Access 模型? 【参考方案1】:

我不会写一个完整的答案,因为我没有足够的时间并且现在无法测试代码。但无论如何:您正在寻找的功能是:

lookup spanning relationships(另见multivalued relationships部分) related descriptors prefetch_relatedPrefetch objects

结合所有这些功能应该解决您的问题。唯一需要注意的是使用 Prefetch 对象过滤菜单项,到目前为止我从未使用过,所以我不能确定它是否会按预期工作。

【讨论】:

【参考方案2】:

这在删除 app_list 和“for 循环”时起作用

apps = App.objects.filter(menu__name=F('menu'))

@bruno desthuilliers,我还在努力理解预取

【讨论】:

以上是关于Django:如何从与用户相关的子查询集中获取不同的父列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从与数据透视相关的行中获取 Builder 对象 - Laravel

如何在 django 查询集中获取表的计算元素?

在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居

Django - 如何从模板中的查询集中获取最后一项

Django如何在查询集中标记用户特定的对象以发送到模板?

如何在查询集中动态设置 Django 过滤器