【问题标题】:Short record query with Django ORM使用 Django ORM 进行短记录查询
【发布时间】:2014-05-08 16:53:58
【问题描述】:

我可以修改以下查询以使其更简洁地使用 Django ORM 吗?

queryset.filter((Q(from_date__lte=from_date) & \
                 Q(to_date__gt=from_date)) | \
                (Q(from_date__lte=to_date) & 
                 Q(to_date__gt=to_date)))

这里有一些例子:

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00",

"from_date": "2014-05-12 12:00:00", 
"to_date": "2014-05-12 15:00:00",

这些是数据库中的日期

如果你提交

fromDate=2014-05-11 08:00:00
toDate=2014-05-11 13:00:00

应该只给我第一次约会

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00",

在这里,应该只给我第一个结果

fromDate=2014-05-11 09:00:00
toDate=2014-05-11 13:00:00

如果我提交以下日期

fromDate=2014-05-11 07:00:00
toDate=2014-05-11 09:00:00

同样,只取第一个结果

如果你这样做,你可以获得两个结果

fromDate=2014-05-11 09:00:00
toDate=2014-05-12 13:00:00

我希望你明白这是什么意思。

查询应该保持相同的逻辑!

【问题讨论】:

  • 您可以使用range 搜索两个日期之间的日期字段,但似乎不是您的情况。
  • 你能告诉我它的样子吗?提前致谢!
  • 您能否强制您的from_date 值小于或等于(或严格小于,如果适用)您的to_date?如果是这样,这允许简化。另外,模型上的 from_dateto_date 值是否可以为空?
  • from_date 总是小于 to_date
  • 嗯。实际上,您的查询不会找到完全在新的from_dateto_date 值内的结果。这是故意的吗?

标签: django django-models django-queryset django-orm


【解决方案1】:
queryset.filter(to_date__gt=from_date, from_date__lt=to_date)

也就是说,要返回的事件必须在新事件开始之后结束,并且必须在新事件结束之前开始。在新的 from_date 之前结束的任何内容都不会返回,也不会返回直到它结束之后才开始的任何内容。

这与您的原始查询不完全匹配,但它与 cmets 中描述的行为匹配,即当数据库中的记录完全在新日期设置的范围内时。

【讨论】:

  • 这个例子没有做它应该做的事情。他需要和日期位于另一天。
  • 稍微调整了一下。日期范围逻辑总是比看起来应该考虑更多。
  • 我要求在设定的日期,如果基地被覆盖,这次它会出现。
  • 我不明白你的评论是什么意思。你能提供一个上面不适用的例子吗?
  • 如果提交这些日期:fromDate = 2014-05-11 07:00:00toDate = 2014 -05-11 09:00:00 用你的查询得到所有的日期,但我只想要第一个,只有那些在这个范围内的。
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 2018-08-26
  • 1970-01-01
  • 2011-03-11
  • 2011-04-11
  • 1970-01-01
  • 2019-07-24
  • 2022-09-27
相关资源
最近更新 更多