在 Django ORM 中正确制作 BETWEEN 子句
Properly make a BETWEEN clause in DjangoORM
我在使用 DjangoORM
在我的数据库中查询所需结果时遇到问题。
这是我的模型。
class HeatWatchList(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
related_name='watchlist_users', on_delete=models.CASCADE)
heat = models.OneToOneField(Heat, related_name='heat_watch_list',
on_delete=models.CASCADE)
next_date_from = models.DateTimeField()
next_date_to = models.DateTimeField()
我想获取今天日期介于 next_date_from
和 next_date_to
字段之间的所有记录。
我可以很容易地在原始文件中做到这一点 sql:
SELECT
*
FROM
farm_management_db.heat_heatwatchlist
WHERE
DATE(now()) BETWEEN DATE(next_date_from) AND DATE(next_date_to);
这是我到目前为止尝试的方法,但我没有得到任何记录:
HeatWatchList.objects.filter(
next_date_from__date__gte=datetime.now().date(),
next_date_to__date__lte=datetime.now().date()
)
您可以向您的模型添加一个函数。
def is_between_date(self):
if Timezone.zone() > next_date_from and timezone.zone() < next_date_to:
return True
return False
您应该改为尝试以下代码(通过删除 __date):
HeatWatchList.objects.filter(
next_date_from__gte=datetime.now().date(),
next_date_to__lte='2017-01-23'
)
您可以这样做(通过删除 __date
)并使用 datetime.combine
from datetime import datetime, time
HeatWatchList.objects.filter(
next_date_from__gte=datetime.combine(datetime.now().date(), time.min),
next_date_to__lte=datetime.combine(datetime.now().date(), time.max)
)
我在使用 DjangoORM
在我的数据库中查询所需结果时遇到问题。
这是我的模型。
class HeatWatchList(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
related_name='watchlist_users', on_delete=models.CASCADE)
heat = models.OneToOneField(Heat, related_name='heat_watch_list',
on_delete=models.CASCADE)
next_date_from = models.DateTimeField()
next_date_to = models.DateTimeField()
我想获取今天日期介于 next_date_from
和 next_date_to
字段之间的所有记录。
我可以很容易地在原始文件中做到这一点 sql:
SELECT
*
FROM
farm_management_db.heat_heatwatchlist
WHERE
DATE(now()) BETWEEN DATE(next_date_from) AND DATE(next_date_to);
这是我到目前为止尝试的方法,但我没有得到任何记录:
HeatWatchList.objects.filter(
next_date_from__date__gte=datetime.now().date(),
next_date_to__date__lte=datetime.now().date()
)
您可以向您的模型添加一个函数。
def is_between_date(self):
if Timezone.zone() > next_date_from and timezone.zone() < next_date_to:
return True
return False
您应该改为尝试以下代码(通过删除 __date):
HeatWatchList.objects.filter(
next_date_from__gte=datetime.now().date(),
next_date_to__lte='2017-01-23'
)
您可以这样做(通过删除 __date
)并使用 datetime.combine
from datetime import datetime, time
HeatWatchList.objects.filter(
next_date_from__gte=datetime.combine(datetime.now().date(), time.min),
next_date_to__lte=datetime.combine(datetime.now().date(), time.max)
)