このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Django (DRF)で、ユーザーのモデルを作成時にハッシュidを別で保存する。

この記事は最終更新日から1年以上が経過しています。

どもです。

Django扱っていると、「あれ、これどうやるんだっけ」と思ってネットで調べたりするのですが、

どうも、 Django (DRF)の情報がネット上に少ない印象。

ちょっとハマったのが、表題であるように、「ユーザーのモデルを作成時の一度だけ(最初)にハッシュidを別で保存する」と言うことをやりたいが、はてどうやるのだろうと。

よくヒットしたやり方がこの様な感じとか、

class CustomUser(AbstractUser):
    hashid = HashidField(null=True, blank=True)

    def save(self, *args, **kw):
        self.hashid = self.id
        return super(CustomUser, self).save(*args, **kw)

とか、

class Article(models.Model):
    hashid = models.CharField(...)

    def save(self, *args, **kwargs):
        super(Article, self).save(*args, **kwargs)
        self.hashid = hashids.encode(self.id)
        super(Article, self).save(*args, **kwargs)

だが、

どうも上手くいかない。

そもそも、ハッシュ化する為に、django-hashid-fieldを使用している。

こやつ、なかなか良い感じのライブラリで、通常ならこの様な形でidをハッシュ化したりするのですが、

class Author(models.Model):
    id = HashidAutoField(primary_key=True)
    name = models.CharField(max_length=40)

当方では、django-allauth(django rest auth)を使用しているので、id(pk)をオーバーライドする様な形だとライブラリ側でエラーが出てややこしい。

あとloopにハマったりしてエラーが出る。どうしたものか。

で、最終的に落ち着いたのが、このやり方。

class CustomUser(AbstractUser):
    hashid = HashidField(null=True, blank=True)

@receiver(post_save, sender=CustomUser)
def hashid_update(sender, instance, created, **kwargs):
    if created:
        instance.hashid = instance.id
        instance.save()

receiverのアノテーションを利用して、新規作成のpost時に一度だけ実行することが出来た。

色々と、探すことが多いのでメモ程度にと。

Related Article

LATEST NEWS

RANKING

ARCHIVE

SPONSOR

現在、掲載募集中です。



Links

現在、掲載募集中です。



About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。