根据主键ID创建标题/slug
如何根据ID创建记录的标题和别名(slug)呢?我在使用django-photologue这个工具。我想根据主键(PK)保存一条记录的标题和别名。问题是,我在记录保存到数据库之前无法获取主键。另一方面,没有标题和别名我又无法保存记录。
针对这种问题,有什么常见的解决办法呢?
3 个回答
要根据记录的ID来命名文件,你有几种选择:
a) 尝试预测ID:
max_pk = self.__class__.objects.aggregate(max_pk=Max('pk'))['max_pk'] or 0
predicted_id = max_pk+1
b) 在ID确定后,使用post_save来重命名文件。
你还可以使用md5哈希值或随机字符串来生成独特的文件名。
顺便提一下,还有一个独立的django-autoslug应用。
通常情况下,你根本不需要使用主键。如果你只是想自动生成唯一的标识符(我认为这就是你想做的唯一原因),那么你应该使用一个叫做 AutoSlugField
的字段。这个字段会通过在标识符后面加上一个递增的数字,直到它变得唯一为止。
有一个 AutoSlugField
的实现,它是 django-command-extensions 这个库的一部分。
如果你的网址应该像这样 "example.com/${obj.id}-${sluggify( obj.title )}"
,那么在使用的时候生成这些网址。这个网址里没有任何不在数据库里的数据,所以不要再加一次。这里的“slug”主要是为了让网址看起来更好看,方便人和搜索引擎。
以Stackoverflow为例:根据主键ID创建标题/Slug
如果你想仅仅通过slug来选择数据,它必须是主键,唯一且不可更改。你要知道,如果还有另一个主键,比如常见的 id
列,那就没必要了。
我并不是说slug不好,也不是说保存slug总是错的。其实有很多合理的理由去数据库里保存它们,但这时候你需要认真考虑你在做什么。
而通过主键选择数据(忽略slug)就不需要考虑太多,所以这应该是默认的做法。