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