这些是我的模型,其中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)

最佳答案

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


lookup spanning relationships(另请参见multivalued relationships上的部分)
related descriptors
prefetch_relatedPrefetch objects


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

08-24 20:12