Я хочу изменить формат расчета времени (модели django, виртуальное поле) - PullRequest
1 голос
/ 20 мая 2019

код поля модели - это

    created = models.DateTimeField(auto_now=True)


    @property
    def now_diff(self):
        return timezone.now() - self.created

У меня вопрос о циркуляции времени Джанго с использованием виртуального поля

токовый выход циркуляции времени 5: 26: 34.349728

Но я хочу 5: 26: 34

Есть ли способ?

спасибо, что дали мне знать ~!

я заскочил на

    @property
    def now_diff(self):
        s=timezone.now() - self.created
        hours, remainder = divmod(s, 3600)
        minutes, seconds = divmod(remainder, 60)
        return '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))

но ошибка


TypeError: 'Todo' object is not subscriptable

TypeError: unsupported operand type(s) for divmod(): 'datetime.timedelta' and 'int'

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Вычтите микросекунд из timedelta, которые у вас есть

from datetime import timedelta


class MyModel(models.Model):
    ...
    created = models.DateTimeField(auto_now=True)

    @property
    def now_diff(self):
        <b>delta = timezone.now() - self.created
        return str(delta - timedelta(microseconds=delta.microseconds))</b>

Для более удобочитаемого решения,

from datetime import timedelta


<b>def chop_microseconds(delta):
    return delta - timedelta(microseconds=delta.microseconds)</b>

class MyModel(models.Model):
    ...
    created = models.DateTimeField(auto_now=True)

    @property
    def now_diff(self):
        return <b>str(chop_microseconds(timezone.now() - self.created))</b>

Некоторые вещи BG

Если мы посмотрим на Исходный код __str__() функции timedelta class,

....
if self._microseconds:
    s = s + ".%06d" % self._microseconds
...

, который преобразует строковое представление объекта timedelta.
Итак, здесь мы вычитаем микросекунду из timedeltaи, следовательно, решил проблему:)

0 голосов
/ 20 мая 2019

Может быть, вы можете попробовать вот так (в основном копия вставлена ​​из этого ответа):

@property
def now_diff(self):
    time_delta = timezone.now() - self.created
    s = time_delta.seconds
    hours, remainder = divmod(s, 3600)
    minutes, seconds = divmod(remainder, 60)
    return '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
...