Django использует выражение F и преобразовывает результат в total_seconds во время обновления - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь обновить набор экземпляров на основе текущих значений для экземпляра.

responses.update(
    last_paused=now(),
    duration=F('seconds_remaining')-(now() - F('last_accessed')).total_seconds()
)

Но я получаю эту ошибку:

Traceback (most recent call last):
  File "/vagrant/Devel/env/lib/python3.5/site-packages/celery/app/trace.py", line 382, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/vagrant/Devel/env/lib/python3.5/site-packages/celery/app/trace.py", line 641, in __protected_call__
    return self.run(*args, **kwargs)
  File "/vagrant/Devel/apps/assessments/tasks.py", line 101, in section_pause
    duration=F('seconds_remaining')-(now() - F('last_accessed')).total_seconds()
AttributeError: 'CombinedExpression' object has no attribute 'total_seconds'

Я пытаюсь обойти обновление каждой строки отдельно.

Модель, в которую я пытаюсь сохранить, выглядит следующим образом:

class Response(models.Model):
    exam_response = models.ForeignKey(ExamResponse)
    section = models.ForeignKey(Section)
    started = models.DateTimeField(default=now)
    ended = models.DateTimeField(null=True)
    seconds_remaining = models.PositiveIntegerField(default=0)
    last_accessed = models.DateTimeField(default=now)
    last_paused = models.DateTimeField(default=None, null=True)

С Postgres вы можете сделать что-то подобное, чтобы получить необходимое значение, но не знаете, как применить его в Django ORM.

select extract('epoch' from timestamp);

1 Ответ

0 голосов
/ 25 июня 2019

Я закончил тем, что изменил поле seconds_remaining на Поле продолжительности .

С этим изменением я могу использовать следующий код для массового обновления:

responses.update(
    last_paused=now(),
    duration=F('seconds_remaining')-(now() - F('last_accessed'))
)

Выражения F('seconds_remaining')-(now() - F('last_accessed')) преобразуются в timedelta объект.

...