Djangoモデルのsave関数をオーバーライドする

例えば、インスタンスをセーブするごとにインクリメントする値をji自動で採番したい場合など。AutoFieldというのもあるけど、インクリメントするフィールドはプライマリーキーと合わせて1つだけという制限があるので。

from django.db import models

class Importance(models.Model):
    ordering = models.IntegerField()
    title = models.TextField()

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['ordering']

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if self.ordering is None:
            self.ordering = _get_ordering()
        super().save(*args, **kwargs)


def _get_ordering():
    last = Importance.objects.order_by('ordering').last()
    if last is None:
        return 1
    return last.ordering + 1

クラス外に_get_orderingという関数をつくって、save()する前に採番しています

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です