如果网址不是唯一的,我应该定义get_absolute_url()吗?

时间:2019-07-19 19:15:00

标签: django django-models

在Django框架中,模型可以定义get_absolute_url()方法。该方法用于为模型实例创建url,并且定义和使用此方法被认为是一种很好的做法。

即使生成的网址不是唯一的,定义此方法仍然是一种好习惯吗?

示例:

class Project(models.Model):
    name = models.CharField(max_length=128)

    def get_absolute_url(self):
        return reverse('xxx:project_details', args=(self.id,))


class Item(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    name = models.CharField(max_length=128)

    def get_absolute_url(self):
        return reverse('xxx:project_details', args=(self.project.id,))

当前,Item实例只能在project_details页面上的列表中看到,我打算保持这种状态。 get_absolute_url()方法返回项目详细信息URL。这意味着同一项目的所有项目都返回相同的URL。这样可以吗?我发现它很有用,因为某些通用视图使用get_absolute_url()并自动重定向到正确的页面。但是,我是Django的新手,想知道这是否以后会引起问题。

1 个答案:

答案 0 :(得分:2)

简短的答案:我建议这样做。通常,get_absolute_url链接到该对象的“唯一标识符”。

  

即使生成的网址不是唯一的,定义此方法仍然是一种好习惯吗?

get_absolute_url(..) [Django-doc]上的文档中提到:

  

定义一个get_absolute_url()方法来告诉Django如何计算   对象的规范网址。对于呼叫者,此方法应   似乎返回一个字符串,该字符串可用于引用对象   HTTP。

     

(...)

     

类似地,Django的其他一些地方,例如联合组织   feed框架,请在定义时使用get_absolute_url()。如果它   对于模型的实例,每个实例都有一个唯一的网址是很有意义的,   您应该定义get_absolute_url()

在数学和计算机科学中,canonical form [wiki]表示:

  

(...)“规范”形式和“常规”形式之间的区别因子字段而异。在大多数字段中,规范形式为每个对象指定唯一的表示形式,而常规形式只是简单地指定其形式,而无需唯一性。 (...)

因此,这表明get_absolute_url如果生成的URL是唯一的,则更有意义。毕竟,get_absolute_url旨在显示该特定对象的详细信息。您可以将其用于redirect(some_object)

尽管当然不会引发错误,但是使用get_absolute_url链接到 parent 对象的详细信息页面并不是很常见。

如果继续,可以将其实现为:return self.project.get_absolute_url(..)而不是实现相同的reverse(..)逻辑,因为如果以后更改项目的get_absolute_url,则{{1 }}的项目也会被更新。