根据主键ID创建标题/slug

1 投票
3 回答
1059 浏览
提问于 2025-04-15 14:54

如何根据ID创建记录的标题和别名(slug)呢?我在使用django-photologue这个工具。我想根据主键(PK)保存一条记录的标题和别名。问题是,我在记录保存到数据库之前无法获取主键。另一方面,没有标题和别名我又无法保存记录。

针对这种问题,有什么常见的解决办法呢?

3 个回答

0

要根据记录的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应用。

1

通常情况下,你根本不需要使用主键。如果你只是想自动生成唯一的标识符(我认为这就是你想做的唯一原因),那么你应该使用一个叫做 AutoSlugField 的字段。这个字段会通过在标识符后面加上一个递增的数字,直到它变得唯一为止。

有一个 AutoSlugField 的实现,它是 django-command-extensions 这个库的一部分。

1

如果你的网址应该像这样 "example.com/${obj.id}-${sluggify( obj.title )}",那么在使用的时候生成这些网址。这个网址里没有任何不在数据库里的数据,所以不要再加一次。这里的“slug”主要是为了让网址看起来更好看,方便人和搜索引擎。

以Stackoverflow为例:根据主键ID创建标题/Slug

如果你想仅仅通过slug来选择数据,它必须是主键,唯一且不可更改。你要知道,如果还有另一个主键,比如常见的 id 列,那就没必要了。

我并不是说slug不好,也不是说保存slug总是错的。其实有很多合理的理由去数据库里保存它们,但这时候你需要认真考虑你在做什么。

而通过主键选择数据(忽略slug)就不需要考虑太多,所以这应该是默认的做法。

撰写回答