如果在Django(使用PostgreSQL数据库)中超过5分钟(否则为0),则以秒为单位获取记录的时间

如果在Django(使用PostgreSQL数据库)中超过5分钟(否则为0),则以秒为单位获取记录的时间,django,postgresql,django-queryset,Django,Postgresql,Django Queryset,我正在检索所有记录,并且我想为那些超过5分钟的记录显示记录的时间 输出应类似于此示例中的内容,两条记录:1.8.9.1和2.7.3.1的时间超过5分钟: ip ... status --------------------- 1.8.9.1 ... 3 hours 2.7.3.1 ... 7 minutes 1.1.1.1 ... up 1.1.1.2 ... up 1.1.1.3 ... up 1.1.1.4 ... up 1.1.1.5 ... up

我正在检索所有记录,并且我想为那些超过5分钟的记录显示记录的时间

输出应类似于此示例中的内容,两条记录:1.8.9.1和2.7.3.1的时间超过5分钟:

ip       ...  status
---------------------
1.8.9.1  ...  3 hours
2.7.3.1  ...  7 minutes
1.1.1.1  ...  up
1.1.1.2  ...  up
1.1.1.3  ...  up
1.1.1.4  ...  up
1.1.1.5  ...  up
以下是我当前的代码:

Interfaces.objects.all()
.annotate(
  age = (datetime.utcnow() - F('timestamp')), # 0:00:08.535704
  age2 = Epoch(datetime.utcnow() - F('timestamp')), # 8.535704
  # age3 = int(Epoch(datetime.utcnow() - F('timestamp'))/300),
  current_time=Value(str(datetime.utcnow()),
                       output_field=null_char_field),
)
.order_by('age','ip')
age和age2都可以工作,但问题是我希望5分钟以上的记录按年龄排序,其余的按ip排序

所以我尝试将年龄设置为0,如果它小于5分钟

如果我直接在postgresql中执行,我会使用以下查询:

select ip, <other fields>,
   case when extract('epoch' from now() - "timestamp") > 300
        then extract('epoch' from now() - "timestamp")
        else 0
   end

有没有办法用django做这件事?

你也可以用另一种更快的方式做。 获取当前时间,减去5分钟,然后搜索所有接口 年龄小于或等于减去的日期

例如:

current_time = datetime.now()
older_than_five = current_time - datetime.timedelta(minutes=5)

Interfaces.objects.all()
.annotate(
   age=Case(
       When(age__lt=older_than_five, then=Value(0)),
       default=F('age')
   )
)
.order_by('age','ip')
我想出来了:

Interfaces.objects.all()
.annotate(
   age=Case(
          When(timestamp__lt=datetime.utcnow() - timedelta(minutes=5),
               then=Cast(Epoch(datetime.utcnow() - F('timestamp')),
                         NullIntegerField)),
          default=0,
          output_field=NullIntegerField
   ),
)
.order_by('age','ip')
顺便说一下,我的导入和相关设置:

from django.db.models import  F, Func, Case, When, IntegerField
from django.db.models.functions import Coalesce, Cast

NullIntegerField = IntegerField(null=True)

class Epoch(Func):
    function = 'EXTRACT'
    template = "%(function)s('epoch' from %(expressions)s)"

这个网站是最有帮助的:

如果你得到了所有的记录,一个选择就是简单地使用all,并在Python中执行你想要的任何排序和组织。我需要显示所有记录,而不仅仅是旧记录。我编写的查询应该显示所有5分钟以上的记录。显示所有记录,而不仅仅是旧记录是什么意思?您的查询显示所有5分钟及以上的记录。我所说的所有记录都是指那些不到5分钟的记录。现在试试,看看是否达到预期效果。这有点像我两天前做的。我已经让它工作了。请看我的答案,谢谢你的尝试。