Skip to main content
 首页 » 编程设计

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

2024年12月31日23itcoder

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

这是我的 View ,有什么方法可以优化它吗?

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) 

请您参考如下方法:

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

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