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

时间:2018-06-22 06:26:17

标签: python django filter model django-queryset

这些是我的模型,其中应用程序具有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)

2 个答案:

答案 0 :(得分:1)

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

结合所有这些功能应该解决您的问题。唯一的警告是使用Prefetch对象过滤菜单项,到目前为止我从未使用过它,因此无法确定它是否可以按预期工作。

答案 1 :(得分:0)

这有助于删除app_list和“ for循环”

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

@bruno desthuilliers,我仍在尝试了解预取