Django:如何将TimeField限制为小时和分钟(比较问题)

rjee0c15  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(148)

我正在使用django开发一个web api,我有一个存储小时:分钟:秒的TimeField,因为它将与来自移动应用程序的小时:分钟(没有秒)进行比较,比较总是失败。
下面是一个没有秒数的比较,它返回空的QuerySet:

>>> journey = Journey \
...        .objects \
...        .filter((Q(route__departStation=1) | Q(route__stop__station_id=1)),
...                (Q(route__arrivalStation=1) | Q(route__stop__station_id=1)),
...                route__departDate="2019-07-31", route__departTime="10:57")
>>> journey
<QuerySet []>

我在比较中加入了秒数:

>>> journey = Journey \
...        .objects \
...        .filter((Q(route__departStation=1) | Q(route__stop__station_id=1)),
...                (Q(route__arrivalStation=1) | Q(route__stop__station_id=1)),
                route__departDate="2019-07-31", route__departTime="10:57:05")
>>> journey
<QuerySet [<Journey: Journey object (1)>]>

因此,我如何才能防止秒数从这个TimeField()保存到数据库中,或者至少我如何才能将比较限制为小时和分钟。

p1iqtdky

p1iqtdky1#

你可以在这里使用一个**TruncMinute**表达式[Django-doc]:

from django.db.models.functions import TruncMinute

journeys = Journey.objects.annotate(
    depart_minute=TruncMinute('route__departTime')
).filter(
    (Q(route__departStation=1) | Q(route__stop__station_id=1)),
    (Q(route__arrivalStation=1) | Q(route__stop__station_id=1))
    route__departDate='2019-07-31', depart_minute='10:57'
)

话虽如此,我还是建议您使用DateTimeField,而不是DateFieldTimeField。实际上,时间只有与日期(和时区)结合使用才有意义。许多国家都有夏令时(DST),或者在历史上改变了时区。因此,最好将这些时间结合使用。

vu8f3i0k

vu8f3i0k2#

在这个模型中,你基本上可以覆盖save方法,获取timefield属性,然后用一个新的datetime.time对象覆盖它,但不把秒存储在其中。
以下是一个示例:

from django.db import models
from datetime import time

class Route(models.Model):
    departTime = models.TimeField(null=True, blank=True)

    def save(self, *args, **kwargs):
        self.departTime = time(hour=self.departTime.hour, minute=self.departTime.minute)
        return super().save(*args, **kwargs)

但是,请记住,当您使用批量操作来创建Route对象或更新查询集时,不会调用save方法。在这些情况下,您可以使用管理器类来覆盖例如bulk_create或bulk_update方法,或者使用QuerySet来覆盖更新方法,并只在其中存储小时和分钟。

相关问题