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
значением?