django中的部分反向URL查找

时间:2014-08-13 16:12:03

标签: python django

我正在寻找一种有效地在大量django模型实例上进行反向URL查找的方法,理想情况下无需为每个实例调用reverse()一次。我的原始代码看起来像这样:

urls = []
for foo in Foo.objects.all():
    url = django.core.urlresolvers.reverse("foo_details", kwargs={"ver": foo.version,
                                                                  "locale": foo.locale,
                                                                  "name": foo.name})
    urls.append(url)

但是,由于存在大量(数千)个Foo对象,因此这个过程耗时太长。所以,我伪造了一次“部分”网址查询,然后完成了每个实例的工作:

base_url = django.core.urlresolvers.reverse("foo_details", kwargs={"ver": foo.version,
                                                                   "locale": foo.locale,
                                                                   "name": ""})
urls = []
for foo in Foo.objects.all():
    url = base_url + urlquote(foo.name)
    urls.append(url)

这是有效的,它比我的第一个解决方案快得多,但我现在正在对网址的形式做出假设,特别是该名称将始终出现在最后。另外,我想为此使用get_absolute_url(),但这消除了仅对网址进行一次部分反转的可能性,然后完成每个对象的反转。

这真的是唯一的方法吗?是否有其他方法可以保留部分反向查找,然后为每个单独的对象完成URL?

1 个答案:

答案 0 :(得分:1)

我通常会按照

的方式做点什么
placeholder = "__placeholder___"
base = reverse("foo_details", 
               kwargs={"ver": foo.version,
                       "locale": foo.locale,
                       "name": placeholder})
# ...
url = base.replace(placeholder, foo.name)

它的作用是假设名称是最后一个路径组件。