Django get_absolute_url查询

时间:2017-08-17 06:46:51

标签: django django-queryset

我在站点地图模板中使用get_absolute_url。不是sitemap.xml,而是站点布局中显示所有链接的页面。我基本上使用get_absolute_url获取所有页面对象,并在模板中使用它们。

我发现对于每个链接,数据库都会被命中一次。如何减少查询?

我想到了两个解决方案,但我不知道哪种方式最好:

  1. 使用Django的站点地图框架。我知道站点地图框架也使用了get_absolute_url。生成sitemap.xml时,我无法检查查询量(调试工具栏没有显示)。
  2. 编写自定义保存方法,并使用get_absolute_url将数据库保存在数据库中
  3. 编辑:

    我使用一些简单的代码来生成链接页面:

    Views.py:

    all_links = mypage.objects.all()
    

    模板:

    <ul>
    {% for link in all_links %}
    <li>li><a href="{{link.get_absolute_url}}">{{link.link_title}}</a></li>
    {% endfor %}
    </ul>
    

    models.py:

    def get_absolute_url(self):
            if self.submenu:
                return "/%s/%s/" %(self.submenu.slug,self.slug)
            elif not self.mainmenu:
                return "/submenu/%s" % self.slug
            else:
                return "/%s/" % self.slug
    

    EDIT2:

    我会在制作时打开缓存。我认为首先进行优化是一件好事。

1 个答案:

答案 0 :(得分:0)

我认为使用get_absolute_url很重要,因为sitemap.xml和我的站点地图页面之间应该没有区别。我现在的解决方案就是这个(总是向更好的解决方案开放)

我创建了一个模型字段:

absolute_url = models.CharField(max_length=400, blank=True, editable=False)

然后自定义保存:

def save(self, *args, **kwargs):
        self.absolute_url = self.get_absolute_url()
        super(mypage, self).save(*args, **kwargs)

在我的模板中:

<ul>
     {% for link in all_links %}
           <li><a href="{{link.absolute_url}}">{{link.menu_title}}</a></li>
     {% endfor %}
</ul>

这为我节省了很多疑问。现在只有一个用于链接(而不是每个链接1个查询)