#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
.