Django (DRF)で、ユーザーのモデルを作成時にハッシュidを別で保存する。
2020.09.10
この記事は最終更新日から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時に一度だけ実行することが出来た。
色々と、探すことが多いのでメモ程度にと。