DjangoBrothers BLOG ✍️

2022/11/10

このエントリーをはてなブックマークに追加
モデル

Django プライマリーキーにUUIDを使った時のsaveメソッドのオーバーライド方法

Djangoモデルのプライマリーキーにこんな感じでUUIDを使用する場面があります。

models.py

class BaseModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

この時、モデルのsaveメソッドを上書きしようとすると、self.id が必ずTrueになってしまいます。 default=uuid.uuid4 がsaveメソッド実行前にIDを割り当ててしまうためです。

これが原因でself.id がNoneかどうかでインスタンスの新規作成 or 更新なのかを見分けることができなくなります。

models.py

    def save(self, *args, **kwargs):
        if not self.id:
            # hogehoge

この場合は、self.id ではなく self._state.adding を使って追加 or 更新を判定することができます。

models.py

    def save(self, *args, **kwargs):
        if self._state.adding:
            # hogehoge  

https://docs.djangoproject.com/en/4.1/ref/models/instances/#other-attributes