如果在Django(使用PostgreSQL数据库)中超过5分钟(否则为0),则以秒为单位获取记录的时间
我正在检索所有记录,并且我想为那些超过5分钟的记录显示记录的时间 输出应类似于此示例中的内容,两条记录:1.8.9.1和2.7.3.1的时间超过5分钟:如果在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
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分钟的记录。现在试试,看看是否达到预期效果。这有点像我两天前做的。我已经让它工作了。请看我的答案,谢谢你的尝试。