Django - SQL 查询 - 时间戳
有没有人能给我推荐一个教程、代码或者其他资源,帮我解决以下问题。
我在一个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过滤器的文档。