根据 ID 创建记录标题和粗节的通用方法是什么?我在这里与 django-photologue 合作。我想根据 PK 保存带有标题和 slug 的记录。一般问题是在记录保存到数据库之前我无法获得 PK。另一方面,没有标题和slug我无法保存它。
这种问题有什么常见的解决方案?
根据 ID 创建记录标题和粗节的通用方法是什么?我在这里与 django-photologue 合作。我想根据 PK 保存带有标题和 slug 的记录。一般问题是在记录保存到数据库之前我无法获得 PK。另一方面,没有标题和slug我无法保存它。
这种问题有什么常见的解决方案?
通常你根本不使用主键。如果您关心的只是自动生成唯一的 slug(这是我可以看到做您想做的事情的唯一原因),那么您需要一个AutoSlugField
,它通过增加 slug 上的附加数字来创建一个唯一的 slug 直到它是独特的。
有一个实现AutoSlugField
是django-command-extensions的一部分。
如果您的 URI 应该看起来像,"example.com/${obj.id}-${sluggify( obj.title )}"
那么在您使用它们时生成这些 uri。此 uri 不包含已不在数据库中的数据,因此不要再次添加它。slug 的唯一目的是使 url 对人们和搜索引擎来说看起来更好。
以 Stackoverflow 为例:根据 PK ID 创建 Title/Slug
如果您只想通过 slug 进行选择,它必须是主键,唯一且不可变。您应该知道,id
不需要另一个 PK(通常的列)。
我不是说蛞蝓不好,也不是说保存蛞蝓总是不好的。将它们保存在数据库中有很多正当理由,但是您需要考虑一下您在做什么。
另一方面,通过 PK 选择数据(并忽略 slug)不需要思考,所以这应该是默认的方式。
要根据记录 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应用程序。