【发布时间】:2009-10-08 11:14:28
【问题描述】:
根据 ID 创建记录标题和粗句的通用方法是什么?我在这里与 django-photologue 合作。我想根据 PK 保存带有标题和 slug 的记录。一般问题是在记录保存到数据库之前我无法获得 PK。另一方面,没有标题和slug我无法保存它。
这类问题有什么常见的解决方案?
【问题讨论】:
标签: python django django-profiles
根据 ID 创建记录标题和粗句的通用方法是什么?我在这里与 django-photologue 合作。我想根据 PK 保存带有标题和 slug 的记录。一般问题是在记录保存到数据库之前我无法获得 PK。另一方面,没有标题和slug我无法保存它。
这类问题有什么常见的解决方案?
【问题讨论】:
标签: python django django-profiles
如果您的 URI 应该看起来像 "example.com/${obj.id}-${sluggify( obj.title )}",那么 在您使用它们时生成这些 uri。此 uri 不包含已不在数据库中的数据,因此不要再次添加它。 slug 的唯一目的是让 url 在人们和搜索引擎中看起来更好。
以 Stackoverflow 为例:Creating Title / Slug based on PK ID
如果您只想通过 slug 进行选择,它必须是主键,唯一且不可变。您应该知道,不需要另一个 PK,即通常的 id 列。
我不是说蛞蝓不好,也不是说保存蛞蝓总是不好的。将它们保存在数据库中有很多正当理由,但是您需要考虑您正在做什么。
另一方面,通过 PK 选择数据(并忽略 slug)不需要考虑,因此这应该是默认方式。
【讨论】:
http://example.com/entries/foo 比http://example.com/entries/1238/foo 看起来更好,该怎么办?在这一点上,将 slug 存储在数据库中是有价值的。它们不会对数据库进行非规范化,因为它们通常只与 initial 标题相关联,实际上不必与任何东西相关联。
通常您根本不使用主键。如果您关心的只是自动生成独特的 slug(这是我能看到做您想做的事情的唯一原因),那么您需要一个 AutoSlugField,它通过在蛞蝓直到它是独一无二的。
AutoSlugField 的实现是django-command-extensions 的一部分。
【讨论】:
要根据记录 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 应用程序。
【讨论】: