任何人都可以转向我的教程,代码或某种资源,以帮助我解决以下问题。
我在mySQL数据库中有一个表。它包含ID,时间戳,另一个ID和值。我正在传递“主”ID,它可以唯一地标识一段数据。但是,我想对这段数据进行时间搜索(因此使用时间戳字段)。因此,最理想的是:在12和1之间,显示ID = 1987记录的所有值。
我如何在Django中查询?我知道在mySQL中它会像小于/大于等等......但是我怎么会在Django中这样做呢?到目前为止,我一直在使用Object.Filter进行大部分数据库处理。最后,我想强调我是Django的新手,我真的很难过!
答案 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的文档。