2016-11-19 65 views
0

我想安排一个删除方法,这样的cron可以执行它,但我想出CommandError: error job not completed我塞进了一些地方只是不知道在哪里:(Django的管理命令来删除旧的对象

from datetime import datetime 

from django.core.management.base import BaseCommand, CommandError 

from jobs.models import Job 

class Command(BaseCommand): 
    help = 'Deletes the old jobs past 30days' 

    def handle(self, *args, **options): 

     try: 
      jobs = Job.objects.filter(has_paid=True) 

      for job in jobs: 
       today = datetime.today() 
       pub_date = job.date_published.date() 

       diff = today - pub_date 

       if diff.days >= 30: 
        job.delete() 
     except: 
      # error message 
      raise CommandError('error job not completed') 

     # success message 
     self.stdout.write('Successfully removed all old jobs') 
+2

好吧,如果你没有故意隐藏Django抛出的错误,也许你可以告诉。 –

+0

我认为它可以从django的日期时间和时区感知日期减去正常日期。或pub_date为空。但正如丹尼尔所说,让异常抛出,让我们看到发生了什么。 (除了后面写“raise”)。 –

+0

@DanielRoseman的意思是,你的bare'except'会捕获所有异常/错误,因此隐藏真正发生的事情。查看你的代码的一种可能性是'date_published'可以为空或者'DateTimeField',这可能导致'AttributeError'或'TypeError'。 – schwobaseggl

回答

1

更快(只有一个数据库查询)和不易出错的方式来做到这一点是:

from django.utils import timezone 

past = timezone.datetime.today() - timezone.timedelta(days=30) 
Job.objects.filter(has_paid=True, date_published__lte=past).delete() 

不过,您不应该使用一般的except来处理所有异常。这几乎是never a good idea,它使调试更难。

+0

我得到错误'RuntimeWarning:DateTimeField Job.date_published收到一个天真的日期时间(2016-10-21 01:31:06.516105),而时区支持处于活动状态。 RuntimeWarning)' – linski

+1

您应该使用'django.utils'中的'timezone.timedelta'和'timezone.datetime.today'。 Django的时区模块提供python的'datetime'的类/函数,但时区感知(不是天真的)。 – schwobaseggl

+0

感谢这更好,最好的答案!再次感谢 :) – linski

1

试试这个弄清楚了什么问题:

from datetime import datetime 

from django.core.management.base import BaseCommand, CommandError 

from jobs.models import Job 

class Command(BaseCommand): 
    help = 'Deletes the old jobs past 30days' 

    def handle(self, *args, **options): 

     jobs = Job.objects.filter(has_paid=True) 

     for job in jobs: 
       today = datetime.today().date() 
       pub_date = job.date_published.date() 

       diff = today - pub_date 

       if diff.days >= 30: 
        job.delete() 

     # success message 
     self.stdout.write('Successfully removed all old jobs') 
+0

这个作品谢谢 – linski