Python 为Django模型对象创建简短的TinyURL,同时保持干净的代码

Python 为Django模型对象创建简短的TinyURL,同时保持干净的代码,python,django,django-urls,Python,Django,Django Urls,我使用这段代码将整数主键转换为缩短的URL 例如,可以将url转换为/articles/a1b2c3/title of article,而不是将url/articles/1000/title of article用于article id 1000 这样做的问题是,我的模型和视图中充斥着对缩短和取消排序这些主键的函数的调用。它们出现在使用主键的每个视图中,以及模型中返回永久链接的方法中,如get_absolute_url() 这似乎是不必要的重复。我想知道是否有一种更优雅的方法可以做到这一点,而不

我使用这段代码将整数主键转换为缩短的URL

例如,可以将url转换为/articles/a1b2c3/title of article,而不是将url/articles/1000/title of article用于article id 1000

这样做的问题是,我的模型和视图中充斥着对缩短和取消排序这些主键的函数的调用。它们出现在使用主键的每个视图中,以及模型中返回永久链接的方法中,如get_absolute_url()


这似乎是不必要的重复。我想知道是否有一种更优雅的方法可以做到这一点,而不需要到处调用这些函数——也许可以通过修改URL调度程序及其反向函数,在生成或解析URL时遇到指定的URL参数时自动调用指定的回调函数,让回调函数执行转换。

如果将缩短的url作为排序存储在数据库中,那么您可以像使用任何其他slug字段一样使用它,直接对其进行过滤,而无需转换

或者: 您可以考虑为使用该技术的任何模型编写自定义管理器,这允许您通过给它一个缩短的URL来搜索表来记录。例如:

MyModel.objects.get_by_short_url('myshorturl')
可实施为:

class MyManager(models.Manager):
    ...
    def get_by_short_url(self, s):
        return self.get(from_tiny(s))

这与您使用模型的get_absolute_url方法的现有想法相结合,意味着缩短算法应该被完全抽象掉。这与使用任何实际字段来识别模型实例(如主键本身或(最好)专用slug字段)没有什么区别。

杂乱无章?这不完全是模型(备用PK)的一个
@属性和模型管理器中使用此备用PK进行查询的一个函数吗?