【问题标题】:How can i compare two DateTimeFields with current time如何将两个 DateTimeFields 与当前时间进行比较
【发布时间】:2021-04-11 19:09:58
【问题描述】:

Event 有两个 DateTimeField,我需要用相同的方法将它们与实际日期时间进行比较。

from django.utils import timezone

event_starts = models.DateTimeField(_("Event starts"))
registration_closes_at = models.DateTimeField(
        _("Registration ends:"), null=True, blank=True
    )

这是我尝试过的,但它不起作用。所以我需要的是:如果活动已经开始或注册已关闭,用户不能参加此活动。

    def is_registration_open(self):
    now = timezone.now()
    passed_registration = now > self.registration_closes_at
    passed_start = now > self.event_starts

    if not passed_registration or not passed_start:
        return

并尝试了这个:

def is_registration_open(self):

    if (
        not timezone.now() > self.registration_closes_at
        or not timezone.now() > self.event_starts
    ):
        return

这是一个失败:

'>' not supported between instances of 'datetime.datetime' and 'NoneType'

当我只比较 event_starts 时,一切正常。

感谢您的帮助!

【问题讨论】:

  • 提示:如果数据库中的日期为空怎么办

标签: python django datetime django-models


【解决方案1】:

注意registration_closes_at 字段可以为空,因此您需要在条件中处理这种情况。

我的猜测是您想在 registration_closes_at 为空时忽略它,因此条件如下:

def is_registration_open(self):
    if self.registration_closes_at:
        # before registration closes
        return timezone.now() < self.registration_closes_at
    else:
        # before event starts
        return timezone.now() < self.event_starts

更好的选择是使用注释并检查数据库的条件以获得更好的性能

from django.db.models import Count, Case, When, Value, BooleanField
from django.db.models.functions import Now

MyModel.objects.annotate(
    can_register=Case(
        When(registration_closes_at__gt=Now(), then=Value(True)),
        When(event_starts__gt=Now(), then=Value(True)),
        default=Value(False),
        output_field=BooleanField(),
    )
)

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多