我正在寻找一种有效地在大量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?
答案 0 :(得分:1)
我通常会按照
的方式做点什么placeholder = "__placeholder___"
base = reverse("foo_details",
kwargs={"ver": foo.version,
"locale": foo.locale,
"name": placeholder})
# ...
url = base.replace(placeholder, foo.name)
它的作用是假设名称是最后一个路径组件。