2017-10-26 6 views
2

私が作業しているプラ​​ットフォームでは、作成するオブジェクトに有効期限を設定できるようにしたいと考えています。設定したカウントダウンが終了すると、そのオブジェクトは削除されます。カウントダウン後にDjangoオブジェクトを削除するには?

どうすればこのことをお勧めしますか?

編集:オブジェクトごとに有効期限が変わることを明確にする必要があります。

+1

これを読むことができます。https://stackoverflow.com/questions/11788821/best-way-to-delete-a-django-model-instance-after-a-date-date –

+0

すごく助かりますcronジョブのために。 – Programmingjoe

答えて

3

説明していることを行う最も一般的な方法は、作成時間と有効期限の列を格納する列を作成することです。は、有効期限が過ぎてからアイテムが削除されたとみなします。

には、期限切れでないアイテムのリストを取得するときはいつでも、期限切れのアイテムを除外するためにそのテーブルに対するクエリに条件を含める必要があります。

何らかの理由でデータを削除することが重要な場合(規制当局のように、またはビジネス要件のため)、期限切れのレコードを削除するために、cronジョブのような定期的なタスクを設定できます。これは、上記の方法と組み合わせて使用​​することができます(また、しばしば使用される)ので、定期的なタスクが最後に実行されてからオブジェクトの一部が期限切れになっても、ユーザーが正しいデータを見ていることができます。

+0

作成された列があります。有効期限の列に何を使用することをお勧めしますか?別の時間フィールドでなければならず、現在の時刻とユーザー入力を手動で追加しますか? – Programmingjoe

+0

これは本当に良いアンサーですが、SQL Serverエージェントのような方法はありませんか? –

+0

@joeオブジェクトが存続する必要がある時間(分)を示すint列を持っているか、別のタイムスタンプがあるかどうかは重要ではありません。別のタイムスタンプを使用する場合は、django ORMを使用してフィルタクエリを行う方が少し簡単です(フィルタクエリは1つの列にのみ依存します) – Jiaaro

0

Jiaaroは正しいタイミングで正確に削除するのではなく、作成した日付をモデル内に保存してから、このモデルのデフォルトのQuerySetを上書きする必要があります。詳細についてはhereをご覧ください。

マネージャは、検索機能を追加/変更する方法です。 get_queryset()を無効にすると、MyModel.objects.all()を実行したときに表示される内容が変更されます。あなたのケースでは、あなたのマネージャーは次のようになります。

class MyModelManager(models.Manager): 
    def get_queryset(self): 
     now = datetime.now() 
     min_created_at = #now - 30 minutes 
     return super(MyModelManager, self).get_queryset().filter(created_at__gt=min_created_at) 

class MyModel(models.Model): 
    created_at = models.DateField(auto_now_add=True, db_index=True) 
    objects = MyModelManager() 

次に、その上に、あなたが断続的に古いデータを消去するにはcronジョブを使用することができます。あなたが興味を持っているなら、Mauricioのリンクはそれを行う方法を示しています。それは最終結果を変更することはありませんが、クエリを少し速く保つことができます。

関連する問題