質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6784閲覧

Djangoのuuid.uuid4を利用したURLからハイフンを取り除きたい

fightTT

総合スコア27

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/17 09:16

Djangoのモデル定義で、idの定義にuuid.uuid4を使用しています。
生成されたidを、ブログなどの詳細ページのキー・URLになるように作っております。

python

1# models.py 2class Model(models.Model): 3 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

この際、uuid4を使用しておりますので2cc20bda-9e23-4aee-8c75-51817041a922のように、ハイフンが3つ含まれています。これを、URLで利用する際にハイフンを取り除いた形で表示したいと考えています。

現状: /articles/2cc20bda-9e23-4aee-8c75-51817041a922
実現したい: /articles/2cc20bda9e234aee8c7551817041a922

しかし、仮に実現できたとして、DB(現在はMariaDBを使用しています)に登録する際にハイフンなしではそもそもUUID型ではなく文字列型として登録されてしまうような気がするので、何か副作用があるのではと考えております。
みなさんは、UUIDのように理論上重複しないようなIDでURLを生成したい際はどのようにしているのでしょうか?

  • 上記のようにハイフンを取り除いての登録・利用は問題ないのか、またその実現方法を教えていただければ幸いです。
環境バージョン
Python3.7.4
Django2.2.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

MySQLにUUID型は存在しないようですから、MariaDBも同じであると思います。

参考

投稿2019/08/17 09:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fightTT

2019/08/17 10:35

> MySQLにUUID型は存在しない この情報を言われて思い出しました(DBも同時に学習しておりますので記憶に漏れが...)。ありがとうございます。 いただいたコメントから改めてDBを確認したところ、DBの方にはハイフンなしの文字列として登録されておりました。先にこちらを確認してから質問するべきでした、すいません。 また、参考でいただいた記事からさらに調べて解決しましたので、別途記載します。
guest

0

自己解決

いただいた参考のQiita記事にありました

MySQLでUUIDを利用するならばバイトか文字列として格納する必要があります

というのを参考にさらに調べたところ、こちらの記事を見つけまして、このように書いてありました。

uuidfieldはデータベースに突っ込む時に(postgres以外なら)char型として突っ込まれ,
取り出す時にuuid.UUID型になります.
UUID型の値,str型にすると550e8400-e29b-41d4-a716-446655440000みたいに間にハイフンが入っちゃいます

ですので表示する際(Djangoプロジェクトのurls.pyに記述するパスコンバータ)で解決すれば問題なさそうです。


以下、解決方法の追記

  1. uuid.uuid4().hexの記述で、ハイフン(ダッシュ)なしUUIDの値を返す関数の作成
  2. 1で帰ってきた値を生のUUID.uuid4の代わりに使用。その際に、UUIDFieldではなくなるので、CharFieldに変更。

models.py

Python

1def get_uuid_no_dash(): 2 return uuid.uuid4().hex 3 4id = models.CharField(primary_key=True, default=get_uuid_no_dash, max_length=33, editable=False, unique=True)

3.パスコンバータを<uuid:pk>から<slug:pk>に変更してハイフンなしの値でマッチするようにする。

urls.py

Python

1path('articles/<slug:pk>/', HogeView.as_view()),

投稿2019/08/17 10:43

編集2019/08/17 12:31
fightTT

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問