为啥我需要在 Django 中使用 SlugField?

Posted

技术标签:

【中文标题】为啥我需要在 Django 中使用 SlugField?【英文标题】:Why do I need to use SlugField in Django?为什么我需要在 Django 中使用 SlugField? 【发布时间】:2021-11-12 05:28:35 【问题描述】:

我在谷歌上搜索发现:“SlugField 是一个用于在关系数据库中存储 URL slug 的字段。SlugField 是 Django ORM 定义的列。SlugField 实际上是在 django.db 中定义的。”

但是,这个定义对我来说听起来有点复杂。在这种情况下,我什至不知道 slug 是什么,也不确定 Django ORM。 我只需要一个简单的理由为什么我应该在 Django 中使用 SlugField。

【问题讨论】:

有些人更喜欢人们访问其网站的 URL 包含与内容相关的字词,而不仅仅是 id - “/articles/news-about-important-thing/” vs “/articles/12312/ ”。这些从标题/名称派生的 URL 友好字符串称为 slugs 哦,我明白了:)谢谢@lain 【参考方案1】:

您并不严格需要使用 SlugField。

“Slug”是从新闻学中借来的一个术语,指的是标题的简短版本。正如对您的回答的评论中提到的那样,这是一种使 URL 更加明确的方法,同时仍然保持它们有点短,而不是使用例如完整标题(通常太长)或 ID(这不会不要明确或令人难忘:想想一个用户想要找到一篇他们记得读过的文章:如果他们开始在他们的地址栏中输入一些关键字,一个包含它的 URL 将弹出,一个带有 ID 的 URL 不会)。

如果您愿意,您可以制作自己的 slug,使其对 URL 友好(删除 URL 不包含的任何符号,转换任何需要 url 编码的内容,将空格变成连字符......)并删除任何不必要的内容(例如删除诸如 the、a、an、is、are... 之类的词或将冗长的标题裁剪为最大数量的词或字符)。

SlugField 只是一种方便,您可以使用它在某种程度上实现自动化。它还附带了一些您可能需要的额外功能:例如,它会自动从您选择的字段中生成一个 slug,并且它可以为该 slug 添加一个唯一编号,这样您就不会意外地得到两个相同的 URL两篇具有相同标题的不同文章。

它是一个字段的原因是,虽然你可以,但每次访问对象时计算 slug 并不聪明:slug 只会在标题更改时更改,这意味着可能永远不会,因此生成它只需一次,然后将其存储在数据库中以供下次使用,而无需再次生成它。这具有使某个文章的 URL 永久化的额外优势:您可以设置它,这样即使您更改文章的标题 which would be a good thing,slug 也不会改变。

一旦你有了它,因为一个 slug 明确地指向一个特定的对象,它充当一种人类可读的唯一 ID,因此它可以像不透明的数字 ID 一样有效地从数据库中检索对象.它还会掩盖您拥有的对象数量(如果出于某种原因您想要这样做),因为顺序 ID(例如 1543)会告诉任何人您可能还有 1542 个其他对象在该对象之前。

【讨论】:

哇 :) 现在一切都说得通了。非常感谢@theberzi 所以,你提到了一些事情。每次访问对象时是否真的有可能计算一个 URL?我的意思是,你所说的计算是什么意思? 当您访问类似 website.com/blog/very-nice-article 这样的地址时,浏览器会使用该 URL 向服务器 (Django) 发送请求,而 Django 必须确定是否存在与该名称相对应的东西。例如,您有一个看起来像 /blog/<slug> 的 url 模式。在这种情况下,<slug> 对应于very-nice-article:视图将其作为参数接收,并且必须在数据库中查找将其作为 slug 的对象。如果您这样做是为了让 slug 可以在标题更改时更改,那么相同的 url 最终可能会指向任何地方,或者指向不同的对象。

以上是关于为啥我需要在 Django 中使用 SlugField?的主要内容,如果未能解决你的问题,请参考以下文章

django 中的预填充字段无法正常工作

django:为啥我们在 modelSerializer 中使用嵌套的元类?

Django - AJAX - 为啥我需要 url 参数?

为啥 django 模板渲染字典这么慢?

为啥我需要在 Django 中将 kwargs 设置为 CBV 的参数

为啥使用 django-rest-framework 时不需要 `csrf_exempt`?