Help us understand the problem. What is going on with this article?

Djangoで作成日時と更新日時、論理削除を設定

More than 1 year has passed since last update.

環境

  • django2.1

ベースモデル

ここで、作成日時と更新日時と削除日時のカラムを作り、論理削除のロジックを作っていく。

base_model.py
from django.db import models
from django.utils import timezone


class BaseQuerySet(models.query.QuerySet):
    def delete(self):
        return super(BaseQuerySet, self).update(deleted_at=timezone.now())

    def hard_delete(self):
        return super(BaseQuerySet, self).delete()

    def alive(self):
        return self.filter(deleted_at=None)

    def dead(self):
        return self.exclude(deleted_at=None)


class BaseManager(models.Manager):
    def __init__(self, *args, **kwargs):
        self.alive_only = kwargs.pop('alive_only', True)
        super(BaseManager, self).__init__(*args, **kwargs)

    def get_queryset(self):
        if self.alive_only:
            return BaseQuerySet(self.model).filter(deleted_at=None)
        return BaseQuerySet(self.model)

    def hard_delete(self):
        return self.get_queryset().hard_delete()


class BaseModel(models.Model):
    # auto_now_add はインスタンスの作成(DBにINSERT)する度に更新
    created_at = models.DateTimeField('作成日時', auto_now_add=True)
    # # auto_now=Trueの場合はモデルインスタンスを保存する度に現在の時間で更新
    updated_at = models.DateTimeField('更新日時', auto_now=True)
    deleted_at = models.DateTimeField('削除日時', blank=True, null=True)

    objects = BaseManager()
    all_objects = BaseManager(alive_only=False)

モデル

各モデルでベースモデルを継承する。
created_at updated_at deleted_atはベースモデルで設定し、継承しているので、モデルでは設定する必要はない。

news_model.py
from django.db import models
from .base_model import BaseModel, BaseManager

class NewsManager(BaseManager):
    ...


class News(BaseModel):
    ...

    objects = NewsManager()
    all_objects = NewsManager(alive_only=False)

論理削除

News.objects.filter(...).delete()

削除

News.objects.filter(...).hard_delete()

論理削除したものも含めて検索

News.all_objects.filter(...)

削除していないデータ

News.all_objects.filter(...).alive()

論理削除したデータ

News.all_objects.filter(...).dead()

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away