【问题标题】:Creating Title / Slug based on PK ID根据 PK ID 创建 Title / Slug
【发布时间】:2009-10-08 11:14:28
【问题描述】:

根据 ID 创建记录标题和粗句的通用方法是什么?我在这里与 django-photologue 合作。我想根据 PK 保存带有标题和 slug 的记录。一般问题是在记录保存到数据库之前我无法获得 PK。另一方面,没有标题和slug我无法保存它。

这类问题有什么常见的解决方案?

【问题讨论】:

    标签: python django django-profiles


    【解决方案1】:

    如果您的 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)不需要考虑,因此这应该是默认方式。

    【讨论】:

    • 您的帖子只是说“蛞蝓很糟糕”,而实际上(至少恕我直言)蛞蝓具有真正的价值。如果您不想公开您的数据库 ID 怎么办?如果您(和我一样)认为http://example.com/entries/foohttp://example.com/entries/1238/foo 看起来更好,该怎么办?在这一点上,将 slug 存储在数据库中是有价值的。它们不会对数据库进行非规范化,因为它们通常只与 initial 标题相关联,实际上不必与任何东西相关联。
    • 绝对不同意 THC4k 并同意 Dominic。 Slugs do 具有真正的价值,而且像 Stackoverflow 一样使用(实际上是随机的)slugs 和 URL 中的 ID 是非常讨厌的。 IMO,slugs 应该是链接到页面的规范方式,因此不应动态生成。
    • 好吧,有一件事是 stackoverflow 处理 slug 的方式对 SEO/SEM 非常不利。
    • @Acidburn2k - 我认为不是,只要他们指定哪个是规范 URL。例如,您会发现 SO 页面在 Google 上的排名非常高。
    • 嗯,一件事是网络上的大多数链接都是规范的。但是允许人们使用指向相同内容的自定义 slug 是没有意义的。
    【解决方案2】:

    通常您根本不使用主键。如果您关心的只是自动生成独特的 slug(这是我能看到做您想做的事情的唯一原因),那么您需要一个 AutoSlugField,它通过在蛞蝓直到它是独一无二的。

    AutoSlugField 的实现是django-command-extensions 的一部分。

    【讨论】:

    • 那是一回事。我想根据记录 ID 命名文件。我希望有这种关系以便于管理。生成唯一文件名的其他解决方案是什么?
    【解决方案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 应用程序。

    【讨论】:

    • (a) 如果您的应用程序将有任何程度的并发写入,则可能不是一个好主意。 (b) 是个好主意。
    • 我同意 (a) 不是那么好。一般来说,它可以被认为是一种快速破解。但是,如果它被用作 FileField 的 upload_to 函数的一部分,那么生成的重复文件名将由 django 自动附加“_”,因此不会出现名称冲突。如果您以常用方式访问文件 - 使用存储在 FileField 中的路径 - 那么就没有问题。但是同意,在这种情况下,映射 pk 文件名可能会被破坏。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    相关资源
    最近更新 更多