這些是我的模型,其中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']這是我的觀點,有什么方法可以對其進行優(yōu)化?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 回答

飲歌長嘯
TA貢獻1951條經驗 獲得超3個贊
我不會寫一個完整的答案,因為我沒有足夠的時間并且無法立即測試代碼。但是無論如何:您正在尋找的功能是:
查找跨越關系的關系(另請參見關于多值關系的部分)
相關描述符
prefetch_related
和Prefetch
對象
結合所有這些功能應該可以解決您的問題。唯一的警告是Prefetch
使用到目前為止我從未使用過的對象過濾菜單項,因此我無法確定它是否可以按預期工作。

MMMHUHU
TA貢獻1834條經驗 獲得超8個贊
這可以刪除app_list和“ for循環(huán)”
apps = App.objects.filter(menu__name=F('menu'))
@bruno desthuilliers,我仍在嘗試了解預取
添加回答
舉報
0/150
提交
取消