Django - SQL 查询 - 时间戳

0 投票
2 回答
1405 浏览
提问于 2025-04-15 13:36

有没有人能给我推荐一个教程、代码或者其他资源,帮我解决以下问题。

我在一个mySQL数据库里有一个表。这个表包含一个ID、时间戳、另一个ID和一个值。我现在有一个“主”ID,它可以唯一识别一条数据。但是,我想根据时间来查找这条数据(所以需要用到时间戳字段)。理想的情况是,我想说:在12点到1点之间,给我显示所有ID为1987的记录。

我该如何在Django中进行查询呢?我知道在mySQL中可以用小于、大于等来实现,但在Django中该怎么做呢?到目前为止,我一直在用Object.Filter来处理数据库。最后,我想强调的是,我是Django的新手,真的有点困惑!

2 个回答

3

如果你要处理的表格对应的是一个Django模型叫做 MyModel,比如说:

class MyModel(models.Model):
    ...
    primaryid = ...
    timestamp = ...
    secondaryid = ...
    valuefield = ...

那么你可以使用下面的代码:

MyModel.objects.filter(
                       primaryid=1987
                      ).exclude(
                       timestamp__lt=<min_timestamp>
                      ).exclude(
                       timestamp__gt=<max_timestamp>
                      ).values_list('valuefield', flat=True)

这段代码会选择主键为1987的记录,并且时间戳在 <min_timestamp><max_timestamp> 之间的条目,然后把对应的值以列表的形式返回。

更新:修正了查询中的一个错误(把 filter 改成了 exclude)。

2

我觉得Vinay Sajip的回答不太对。根据他的代码,最接近正确的写法是:

MyModel.objects.filter(
                       primaryid=1987
                      ).exclude(
                       timestamp__lt=min_timestamp
                      ).exclude(
                       timestamp__gt=max_timestamp
                      ).values_list('valuefield', flat=True)

这段话的意思是“排除掉时间戳小于最小值的记录,排除掉时间戳大于最大值的记录。”另外,你也可以这样做:

MyModel.objects.filter(
                       primaryid=1987
                      ).filter(
                       timestamp__gte=min_timestamp
                      ).exclude(
                       timestamp__gte=max_timestamp
                      ).values_list('valuefield', flat=True)

exclude()和filter()是相反的:exclude()是排除掉指定的行,而filter()是包含它们。你可以把这两个方法结合起来,选择你想要包含或排除的内容。在你的情况下,你想要exclude()那些低于最小时间戳的记录,以及exclude()那些高于最大时间戳的记录。

这里有关于链式使用QuerySet过滤器的文档。

撰写回答