为什么在Django中使用SlugField()?

Ryu*_*usa 41 django slug

Django models.SlugField()有助于我们创建一些很酷的网址.我的问题是为什么将它指定为一个字段

假设我有这个模型

 class Blog(models.Model):
    title = models.CharField()
Run Code Online (Sandbox Code Playgroud)

如果我想添加slug,我可以使用

 class Blog(models.Model):
    title = models.CharField()

    def title_slug(self):
       return slugify(self.title)
Run Code Online (Sandbox Code Playgroud)

在我可以使用的网址中

(r'^blog/(?P<id>\d+)/(?P<slug>[-\w]+)/$', 'app.views.blog_view'),
Run Code Online (Sandbox Code Playgroud)

并在意见中

def blog_view(request, id ,slug):
    get_object_or_404(Blog, pk=id)
    ...
Run Code Online (Sandbox Code Playgroud)

网址看起来像

example.com/blog/23/why-iam-here/

有三件事让我采用这种方法

  1. Slug字段没有隐含的唯一性.
  2. get_object_or_404(Blog, pk=id)必须快于get_object_or_404(Blog, slug=slug).
  3. 将slug字段添加到现有模型涉及数据迁移.

那为什么SlugField()?除了动态生成段塞的成本外,上述方法有哪些缺点?

all*_*aps 33

为什么在Django中使用SlugField()?因为:

  1. 它是人类友好的(例如/ blog /而不是/ 1 /).
  2. 在标题,标题和URL中创建一致性是很好的SEO.

动态生成的slug的大缺点是,接受urls.py中的slu and而不使用slug来获取正确的对象?这是糟糕的设计.

如果您提供并接受slug,但不检查它们,那么您有多个URL返回相同的内容.所以/ 1/useful-slug // 1/this-is-a-bs-slug /都将返回同一页面.

这很糟糕,因为它不会让人类生活轻松.您的访问者必须提供ID和冗余的内容.重复的页面是搜索引擎的噩梦.哪个页面是正确的?重复的页面最终排名较低.请参阅https://support.google.com/webmasters/answer/40349?hl=en(last p)

您可以争辩说,您始终如一地实现自己生成的精美链接,但人们和机器人一直在猜测URL(请参阅您的日志文件).当你接受所有的slu,然后人类和机器人总是猜对了.

将一个slug保存到db也可以节省处理能力.您生成一次slug并重复使用它.什么会更有效地查找slug或每次生成它?

管理员中的Slug字段对于编辑者有机会编辑slug非常有用.也许提供不在标题中但仍值得一提的额外信息.

额外奖励:要更新迁移的数据:

from django.template.defaultfilters import slugify

for obj in Blog.objects.filter(slug=""):
    obj.slug = slugify(obj.title)
    obj.save()
Run Code Online (Sandbox Code Playgroud)

  • Stackoverflow使用重定向(我喜欢它):http://stackoverflow.com/questions/17495299/this-will-be-replaced欢迎您! (19认同)
  • 如果你不打算写两次相同的东西,或者如果你真的不关心不一致的话,我会说这个slug是没用的.节省处理能力?生成一个url真的没什么,在你的数据库中有一个冗余列更烦人.我真的没有看到这个slug的重点() (2认同)

Tim*_*ony 11

Slug字段没有隐含的唯一性.

a没有隐含的唯一性CharField.您需要指定unique=True是否要确保每行在数据库级别都是唯一的.你必须同时使用a CharField和a都SlugField没有优势

get_object_or_404(Blog,pk = id)必须比get_object_or_404(Blog,slug = slug)快.

由于主键上的索引可能会有一个非常小的差异,但它可能可以忽略不计.这与使用CharFieldvs 无关SlugField- 你刚刚创建了一个不同的URL,它接受id并正在使用它来进行查找.

将slug字段添加到现有模型涉及数据迁移.

添加CharField到现有模型还需要数据迁移,因此这里没有优势.


SlugFieldsCharField需要额外的验证.看看代码.你正在打破Django的DRY黄金法则 - 不要重复自己.

此外,如果你只是使用a,CharField你没有在表单级别获得任何验证,那么你可以很容易地创建一个不符合slugs验证的"slug",即它可能包含不允许的空格或字符在URL中.

此外,通过这种方法,如果您更改了标题,则您的URL已更改,现在所有旧链接都已丢失.有一个slug字段可以防止这种情况.

你在这里为自己制造麻烦 - 只需使用 SlugField

  • https://docs.djangoproject.com/en/1.7/ref/models/fields/#slugfield SlugField"意味着将Field.db_index设置为True." 因此,它应该默认编入索引. (3认同)