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