Django - SQL查询 - 时间戳

时间:2009-08-14 18:41:27

标签: python mysql django

任何人都可以转向我的教程,代码或某种资源,以帮助我解决以下问题。

我在mySQL数据库中有一个表。它包含ID,时间戳,另一个ID和值。我正在传递“主”ID,它可以唯一地标识一段数据。但是,我想对这段数据进行时间搜索(因此使用时间戳字段)。因此,最理想的是:在12和1之间,显示ID = 1987记录的所有值。

我如何在Django中查询?我知道在mySQL中它会像小于/大于等等......但是我怎么会在Django中这样做呢?到目前为止,我一直在使用Object.Filter进行大部分数据库处理。最后,我想强调我是Django的新手,我真的很难过!

2 个答案:

答案 0 :(得分: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)

这将选择具有primaryid 1987的条目,时间戳值介于<min_timestamp><max_timestamp>之间,并返回列表中的相应值。

更新:已修正查询中的错误(filter - &gt; exclude)。

答案 1 :(得分: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()包含它们。您可以使用它们的组合来包含/排除您喜欢的任何一个。在您的情况下,您希望排除()低于最小时间戳的那些,并排除()超过最大时间戳的那些。

以下是chaining QuerySet filters的文档。