如何在24小时后自动删除Django模型对象

gajydyqb  于 2023-02-20  发布在  Go
关注(0)|答案(2)|浏览(186)

我是django的新手,我想在特定时间后自动删除一个模型对象。

这是我想要删除的模型

class CustomerOrder(models.Model):
    order_types = (
        ('dinein','Dinein'),
        ('delivery','Delivery'),
        ('pickup','Pickup')
    )
    restaurant = models.ForeignKey(RestaurantDetail,on_delete=models.CASCADE,null=True)
    customer_name = models.CharField(max_length=30,null=True)
    table_no = models.IntegerField(null=True)
    total_price = models.FloatField(null=True,blank=True)
    success = models.BooleanField(default=False,blank=True,null=True)
    status = models.CharField(max_length=15,default='pending',null=True)
    ordered_menu = models.ManyToManyField(OrderedMenu)
    timestamp = models.DateTimeField(default=datetime.datetime.now())
    order_type = models.CharField(max_length=15,default='dinein',choices=order_types)

timestamp是当前对象节省的时间。
有没有关于如何在特定时间后自动删除模型对象的想法?(例如24小时后)

fcg9iug3

fcg9iug31#

您有两种选择:
1.定期任务使用django-celery-beat
1.设置一个cron作业,通过bash运行www.example.com命令 manage.py command via bash

    • 编辑:**按照文档中提到的方法安装和配置django-celery-beat后,您创建了一个celery任务,该任务每5分钟运行一次,例如:
import datetime
from celery.schedules import crontab
from celery.task import periodic_task
from django.utils import timezone

@periodic_task(run_every=crontab(minute='*/5'))
def delete_old_orders():
    d = timezone.now() - datetime.timedelta(hours=24)
    #get expired orders
    orders = CustomerOrder.objects.filter(timestamp__lt=d)
    #delete them
    orders.delete()
t8e9dugd

t8e9dugd2#

您可以使用您的数据库服务器来为您做这项工作,许多数据库服务器将允许您运行查询在预定的时间间隔。
具体方法取决于您的数据库服务器。在Mysql/MariaDb中,您可以使用以下命令:

CREATE EVENT delete_expired_orders
          ON SCHEDULE EVERY 1 DAY
          STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
          DO
            DELETE FROM djangoapp_customerorder
            WHERE UNIX_TIMESTAMP(timestamp) + 86400 < UNIX_TIMESTAMP();

注:

  • 您必须将表名djangoapp_customerorder更改为正确的名称。
  • 86400是一天中的秒数,而我所做的是在我的模型中有一个expiration字段,所以我只需要使用WHERE UNIX_TIMESTAMP(expiry) < UNIT_TIMESTAMP()而不必添加86400

要将其部署到您的各种环境中,您可以通过创建一个新的迁移并在其中添加SQL代码来将其添加到Django迁移中,如下所示:

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [("djangoapp", "0001_initial")]

    operations = [
        migrations.RunSQL(
            sql="""
                CREATE EVENT delete_expired_orders
                ON SCHEDULE EVERY 1 DAY
               STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
               DO
                   DELETE FROM djangoapp_customerorder
                   WHERE UNIX_TIMESTAMP(timestamp) + 86400 < UNIX_TIMESTAMP()
                """,
            reverse_sql="""
                DROP EVENT delete_expired_orders
            """,
        ),
    ]

同样,您需要根据需要更改thedjangoappdjangoapp_customerorder0001_initial
您可能需要针对您的环境进一步调整这种方法,但是这种方法在我使用它时是有效的。

相关问题