小编Her*_*e__的帖子

根据 DateTimeField 从数据库中自动删除 Django 对象

让我们想象一个带有名称和过期日期的简单食品模型,我的目标是在达到过期日期后自动删除对象。

我想在达到exp_date后立即从数据库中删除对象(在我的例子中是postgresql),而不是在我的代码中通过exp_date__gt=datetime.datetime.now()进行过滤,然后使用cron/celery一次通过exp_date__lt=datetime进行过滤的脚本.datetime.now() 然后删除

Food(models.Model):
    name = models.CharField(max_length=200)
    exp_date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

*当通过端点访问对象时,我可以使用普通视图来完成此操作,甚至可以使用 DRF 来实现,如下所示:

class GetFood(APIView):

    def check_date(self, food):
        """
       checking expiration date   
        """
       
       if food.exp_date <= datetime.datetime.now():
           food.delete()
           return False 

    def get(self, request, *args, **kwargs):

        id = self.kwargs["id"]

        if Food.objects.filter(pk=id).exists():

            food = Food.objects.get(pk=id)
            
            if self.check_date(food) == False:
               return Response({"error": "not found"}, status.HTTP_404_NOT_FOUND)
            else:
                name = food.name 
                return Response({"food":name}, status.HTTP_200_OK)
                
            
        else:
          return Response({"error":"not found"},status.HTTP_404_NOT_FOUND)        
Run Code Online (Sandbox Code Playgroud)

但如果没有人尝试通过端点访问该对象,它就不会删除该对象。

*我还可以使用一个脚本设置 cronjob,该脚本查询数据库中每个过期日期小于今天的 Food 对象,然后删除该对象,甚至设置 Celery。如果我使用 DateField,它确实只需要每天运行一次,但是当我使用 DateTimeField 时,它需要每分钟运行一次(出于纽约项目的需要,每秒运行一次)。

*我还想到了一种奇特的解决方法,使用带有 while 循环的 post_save 信号,如下所示:

@receiver(post_save, sender=Food)
def …
Run Code Online (Sandbox Code Playgroud)

python django postgresql

2
推荐指数
1
解决办法
2151
查看次数

标签 统计

django ×1

postgresql ×1

python ×1