【问题标题】:Django get_absolute_url queriesDjango get_absolute_url 查询
【发布时间】:2021-07-04 11:46:44
【问题描述】:

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

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

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

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

编辑:

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

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

编辑2:

我将在生产时打开缓存。我觉得先优化是好事。

【问题讨论】:

  • 如果你有请求对象,那么你可以使用this它甚至不会访问你的数据库一次
  • 我想要一份我的网站所有可用网址的列表。我不明白如何为此使用请求对象?
  • 如果您不显示生成查询的代码,我们将无能为力。
  • 还有更多解决方案,例如缓存或优化获取所有对象的查询,但如果没有您的代码,则无法提供建议
  • 感谢您的所有回复。我已经在我的问题中添加了代码。

标签: django django-queryset


【解决方案1】:

我认为使用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 个查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2019-04-27
    • 2015-07-01
    • 2020-11-26
    相关资源
    最近更新 更多