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

时间:2011-06-03 16:53:47

标签: python django django-urls

我使用此代码https://github.com/kylebragger/tiny/blob/master/tiny.py将整数主键转换为缩短的网址。

例如,不是使用文章ID 1000的url / articles / 1000 / title-of-article,而是将url转换为/ articles / a1b2c3 / title-of-article。

执行此操作的问题在于,我的模型和视图中充斥着对缩短和不缩短这些主键的函数的调用。它们出现在使用主键的每个视图中,以及模型中返回永久链接的方法,如get_absolute_url()。

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

1 个答案:

答案 0 :(得分:1)

如果您将缩短的网址作为slug field种类存储在数据库中,那么您可以像使用任何其他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方法的想法相结合意味着缩短算法应该被完全抽象掉。这使得它与使用任何真实字段来识别模型实例(如主键本身)或(最好)专用的段塞字段没有什么不同。