web-dev-qa-db-ja.com

DjangoでSlugField()を使用する理由

Djangoにはmodels.SlugField()があり、クールなURLを作成するのに役立ちます。私の質問は、それをフィールドとして指定する理由です

私はこれを持っていると仮定しますmodel

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

スラッグを追加したい場合は、使用することができます

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

    def title_slug(self):
       return slugify(self.title)
_

in rls私はちょうど使用できます

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

およびviews

_def blog_view(request, id ,slug):
    get_object_or_404(Blog, pk=id)
    ...
_

uRLは次のようになります

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

この方法を採用する理由は3つあります

  1. スラッグフィールドには、暗黙的な一意性はありません。
  2. get_object_or_404(Blog, pk=id)get_object_or_404(Blog, slug=slug)よりも高速でなければなりません。
  3. スラグフィールドを既存のモデルに追加するには、データの移行が必要です。

なぜSlugField()なのか? 、動的にスラッグを生成するコストは別として、上記の方法の欠点は何ですか?

41
Ryu_hayabusa

DjangoでSlugField()を使用する理由なぜなら:

  1. 人間に優しい(たとえば、/ 1 /ではなく/ blog /)。
  2. タイトル、見出し、URLに一貫性を持たせるのは良いSEOです。

動的に生成されたスラッグの大きな欠点は、urls.pyでスラッグを受け入れ、スラッグを使用して適切なオブジェクトを取得しないことですか?それは悪いデザインです。

スラッグを提供して受け入れても、それらをチェックしない場合、同じコンテンツを返す複数のURLがあります。 / 1/useful-slug /および/ 1/this-is-a-bs-slug /は両方とも同じページを返します。

これは、人間の生活を楽にするものではないため、悪いことです。訪問者はIDと冗長なものを提供する必要があります。複製されたページは検索エンジンの悪夢です。正しいページはどれですか?複製されたページのランクは低くなります。 https://support.google.com/webmasters/answer/40349?hl=en (最後のp)を参照

独自に美しく生成されたリンクを一貫して実装すると主張できますが、人々やボットは常にURLを推測します(ログファイルを参照してください)。すべてのナメクジを受け入れると、人間とボットは常に正しい推測をします。

また、dbにスラッグを保存すると、処理能力が節約されます。一度スラッグを生成して再利用します。毎回スラッグを検索したり、生成したりするのは(非)効率的ですか?

Adminのスラッグフィールドは、スラッグを編集する機会をエディターに与えるのに役立ちます。タイトルにはないが、言及する価値のある追加情報を提供することもできます。

ボーナス:移行したデータを更新するには:

from Django.template.defaultfilters import slugify

for obj in Blog.objects.filter(slug=""):
    obj.slug = slugify(obj.title)
    obj.save()
33
allcaps

スラッグフィールドには、暗黙的な一意性はありません。

CharFieldには暗黙的な一意性はありません。指定する必要があります unique=True 各行がDBレベルで一意であることを確認する場合。 CharFieldSlugFieldの両方でこれを行う必要があるため、どちらにも利点はありません

get_object_or_404(Blog、pk = id)は、get_object_or_404(Blog、slug = slug)よりも高速でなければなりません。

主キーのインデックスのために非常にわずかな違いがあるかもしれませんが、おそらく無視できます。これはCharFieldSlugFieldの使用とは関係ありませんが、idを使用する別のURLを作成し、それを使用してルックアップを実行しています。

スラグフィールドを既存のモデルに追加するには、データの移行が必要です。

CharFieldを既存のモデルに追加するにはデータの移行も必要であるため、ここでは利点はありません。


SlugFieldsは、単にCharFieldに追加の検証を加えたものです。 コードを見てください 。 DRY-繰り返さないでください。

さらに、CharFieldを使用すると、フォームレベルで検証が行われないため、slugsの検証に適合しない「スラッグ」を非常に簡単に作成できます。またはURLで許可されていない文字。

また、このアプローチでは、タイトルを変更するとURLが変更され、古いリンクはすべて無効になります。スラッグフィールドがあると、これを防ぐことができます。

あなたはここであなた自身のためにより多くのトラブルを起こしている-SlugField

11
Timmy O'Mahony