在我的django项目中,我想自动删除超过10天的数据。
我该如何撰写此视图?它如何自动执行?
在我的模型中有一个post_date
字段,我想通过该字段检查它是否为10天。
model.py:
class CustomerLeads(models.Model):
title = models.CharField(max_length=100, null=True, blank=True)
budget = models.IntegerField(default=0,null=True, blank=True)
posting_date = models.CharField(max_length=300,null=True, blank=True)
quantity = models.IntegerField(default=1,null=True, blank=True)
我怎样才能获得差异。我从当前日期获得2016-12-15 <type 'datetime.date'>
,我的发布日期值为12-Dec-2016 <type 'unicode'>
提前致谢。
答案 0 :(得分:2)
执行此操作的一种好方法是在django Link中使用管理命令功能。
在python文件中编写代码并将其放在cron中,以便在特定时间每天运行。在程序中查找超过10天的对象并删除它们用于您的用例。
dateiff不适合您的原因是因为您使用字符字段在代码中存储当前日期时间。将posting_date的字段类型更改为django datetime字段。 Link
posting_date = models.DateTimeField(auto_now_add=True)
添加管理程序。这将是这样的:
# purge_old_data.py
from django.core.management.base import BaseCommand, CommandError
from cus_leads.models import CustomerLeads
from datetime import datetime, timedelta
class Command(BaseCommand):
help = 'Delete objects older than 10 days'
def handle(self, *args, **options):
CustomerLeads.objects.filter(posting_date__gte=datetime.now()-timedelta(days=10)).delete()
self.stdout.write('Deleted objects older than 10 days')
如何运行此命令:
python <code_base>/manage.py purge_old_data --settings=<code_base>.settings.<env>
我假设的项目结构:
cus_leads/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
purge_old_data.py
tests.py
views.py
- 但是,我建议你不要删除对象。而是将字段添加为is_deleted,并在10天后将其设置为true。这将有助于您进行分析。
另外@ e4c5指出:
您应该删除它或移动到归档表,因为布尔值 列无法有效索引,这将减慢速度 你的数据库随着时间的推移。
答案 1 :(得分:1)
如果你在Unix系统上使用crontab这是一种简单而有效的方法来自动执行任务,然后编写一个python脚本(在你的项目中),它将导入你的模型并为你做工作,使用日期时间检查从今天起的最后X天。
然后在crontab中调用它,就像在Unix shell中调用它一样。
提示:您可以将包含所有任务的crontab文件放入项目中,然后将其复制或sym link it复制到/etc/cron.d