Django DurationField и 00:00:00 против NULL

Используется Django 3.2.7, python 3.9.x и Mysql 8.x.

С моделями, подобными этой:

class Object(models.Model):
   period = models.DurationField('Period', null=False, blank=False, default=timedelta(days=1))

class Subobject(models.Model):
   object = models.ForeignKey(Object, null=False, blank=False, on_delete=models.CASCASE)
   period = models.DurationField('Period', null=True, blank=True)

и следующий запрос:

sub_objs = Subobject.objects.select_related(
    'object'
).annotate(
    actual_period=Case(
        When(
            period__isnull=False,
            then=F('period')
        ),
        default=F('object__period'),
        output_fields=models.DurationField()
    )
).filter(
    actual_period__gte=timedelta(seconds=3600)
)

Человечески это можно перевести как: "для каждого подобъекта назначить переменную с именем actual_period, значением которой будет period, если она найдена "локально" в каждом объекте, с возвратом к родительскому свойству object.period, если нет; затем фильтровать и т.д."

Это работает, но давайте представим случай, когда подобъект должен иметь свойство period установленное на "нет времени вообще", т.е. timedelta == 0 секунд.

Я пытался установить поле subobject.period на 00:00:00 в админке, или на timedelta(seconds=0) программно, и похоже, что django (Mysql?) всегда считает такую timedelta равной null. Следствием этого является то, что в приведенном выше запросе в аннотации применяется свойство period родительского объекта.

Работает ли это так, как задумано? Есть ли способ заставить django/mysql считать, что "нулевая временная дельта" не является null значением?

Вернуться на верх