Django timezone.now () значение не меняется - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь аннотировать набор запросов с определенным значением. Это моя аннотация:

def annotate_time(self, name='time'):
        annotation = {
            name: Case(
                When(
                    datetime_submitted__isnull=False,
                    then=((F('datetime_submitted') - F('datetime_started')) / 1000000)
                ),
                When(
                    task__end_time__lt=timezone.now(),
                    then=((F('task__end_time') - F('datetime_started')) / 1000000)
                ),
                default=((timezone.now() - F('datetime_started'))),
                output_field=IntegerField()
            )
        }

        return self.annotate(**annotation)

Первые два случая When уже работают, но я не уверен, почему, если выбран случай default, значения всегда постоянная для всех элементов в наборе запросов независимо от того, сколько раз эта функция выполняется. Я что-то здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

После серии проб и ошибок я наконец-то смог заставить ее работать. Вместо того, чтобы просто использовать timezone.now(), я отформатировал его и использовал timezone.now().strftime('%Y%m%d%H%M%S').

0 голосов
/ 05 февраля 2020

Вероятно, по умолчанию создается экземпляр во время компиляции, поэтому вы можете обойти это, установив его в начале функции, то есть:

def annotate_time(self, name='time'):
    d = timezone.now() - F('datetime_started')
    annotation = {
        name: Case(
            When(
                datetime_submitted__isnull=False,
                then=((F('datetime_submitted') - F('datetime_started')) / 1000000)
            ),
            When(
                task__end_time__lt=timezone.now(),
                then=((F('task__end_time') - F('datetime_started')) / 1000000)
            ),
            default=d,
            output_field=IntegerField()
        )
    }

    return self.annotate(**annotation)

Возможно, стоит отметить, что значение по умолчанию должно быть константой, поэтому другим способом было бы сделать еще один оператор When, чтобы охватить остальные случаи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...