временные данные ‘0:02:00’ не соответствуют формату ‘%H %M %S’

#python #django #datetime

#python #django #дата и время

Вопрос:

Я хочу сохранить строку в формате времени, чтобы сохранить ее в базе данных для проекта django, вот мой utils.py файл:

 import datetime
import re
import math
from django.utils.html import strip_tags

def count_words(text_string):
    word_string = strip_tags(text_string)
    matching_words = re.findall(r'w ', word_string)
    count = len(matching_words)
    return count

def get_read_time(text_string):
    count = count_words(text_string)
    read_time_min = math.ceil(count/200.0) #Assuming 200 words per min Reading
    read_time = str(datetime.timedelta(minutes=read_time_min))
    return read_time
  

Вот необходимая часть models.py файла:

 class Post(models.Model):
    read_time = models.TimeField(null=True, blank=True)
  

Вот необходимая часть views.py file :

 class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        texts = self.object.content
        # print(texts)
        read_time=get_read_time(texts)
        # print(read_time)
        Post.objects.create(read_time=datetime.strptime(read_time, "%H:%M:%S"))
        return context
  

Выходной формат строки 0:02:00 такой, я хочу сохранить его в базе данных как поле datetime.
Но я сталкиваюсь с этой ошибкой:-

 
Exception Type: ValueError at /post/this-blog-contains-an-image-with-it/
Exception Value: 's' is a bad directive in format '%H:%MM:%ss'

  

Комментарии:

1. Выполните поиск по вашему проекту для %H:%MM:%ss потому что похоже, что что-то определяет это, и это неверно.

Ответ №1:

TimeField [Django-doc] ожидает time объект, а не datetime object. Вы можете использовать .time() метод [Django-doc] для извлечения временной части:

 class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        texts = self.object.content
        read_time=get_read_time(texts)
        Post.objects.create(read_time=datetime.strptime(read_time, '%H:%M:%S').time())
        return context  

Однако довольно странно создавать строку вместо возврата самой timedelta части:

 def get_read_time(text_string):
    count = count_words(text_string)
    read_time_min = math.ceil(count/200.0) #Assuming 200 words per min Reading
    return datetime.timedelta(minutes=read_time_min)  

Затем вы можете использовать этот timedelta для получения времени:

 class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        texts = self.object.content
        read_time=get_read_time(texts)
        Post.objects.create(read_time=(datetime.datetime.min   read_time).time())
        return context  

Кроме того, не имеет смысла создавать объекты в get_context_data . Предполагается, что запрос GET не должен иметь никаких побочных эффектов, поэтому вы должны вносить изменения в базу данных только для запросов POST, PUT, PATCH, DELETE и т.д. Не в get_context_data .