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/
有三件事让我采用这种方法
get_object_or_404(Blog, pk=id)
必须快于get_object_or_404(Blog, slug=slug)
.那为什么SlugField()?除了动态生成段塞的成本外,上述方法有哪些缺点?
all*_*aps 33
为什么在Django中使用SlugField()?因为:
动态生成的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)
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)快.
由于主键上的索引可能会有一个非常小的差异,但它可能可以忽略不计.这与使用CharField
vs 无关SlugField
- 你刚刚创建了一个不同的URL,它接受id
并正在使用它来进行查找.
将slug字段添加到现有模型涉及数据迁移.
添加CharField
到现有模型还需要数据迁移,因此这里没有优势.
SlugFields
只CharField
需要额外的验证.看看代码.你正在打破Django的DRY黄金法则 - 不要重复自己.
此外,如果你只是使用a,CharField
你没有在表单级别获得任何验证,那么你可以很容易地创建一个不符合slugs验证的"slug",即它可能包含不允许的空格或字符在URL中.
此外,通过这种方法,如果您更改了标题,则您的URL已更改,现在所有旧链接都已丢失.有一个slug字段可以防止这种情况.
你在这里为自己制造麻烦 - 只需使用 SlugField
归档时间: |
|
查看次数: |
29413 次 |
最近记录: |