#python #django #datetime #mariadb
#python #django #дата-время #мариадб #mariadb
Вопрос:
Добрый день, я пытаюсь использовать DATE_FORMAT
(справочную) функцию, предоставляемую MariaDB, для преобразования datetime
поля str
непосредственно из базы данных;
# Dummy Model
class FooBar(models.Model):
datetime = models.DateTimeField()
# Query
FooBar.objects.all().annotate(dt_field=Func('datetime', Value("'%W %M %Y'"), function='DATE_FORMAT'))
Если я проверю результирующий запрос, результат будет таким, как ожидалось.
>>> print(FooBar.objects.annotate(str_date=Func('datetime', Value("'%Y-%m-%d %H:%M:%S'"), function='DATE_FORMAT')).query)
SELECT DATE_FORMAT(`foobar`.`datetime`, '%Y-%m-%d %H:%M:%S') AS `str_date` FROM `foobar`
Однако фактическое выполнение запроса завершается с ошибкой:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 252, in __repr__
data = list(self[:REPR_OUTPUT_SIZE 1])
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 258, in __len__
self._fetch_all()
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1261, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 74, in __iter__
for row in compiler.results_iter(results):
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1096, in apply_converters
value = converter(value, expression, connection)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/mysql/operations.py", line 265, in convert_datetimefield_value
value = timezone.make_aware(value, self.connection.timezone)
File "/usr/local/lib/python3.8/site-packages/django/utils/timezone.py", line 270, in make_aware
return timezone.localize(value, is_dst=is_dst)
File "/usr/local/lib/python3.8/site-packages/pytz/__init__.py", line 237, in localize
if dt.tzinfo is not None:
AttributeError: 'str' object has no attribute 'tzinfo'
Я, должно быть, что-то делаю или предполагаю что-то неправильно, какой-нибудь совет?
Комментарии:
1. Это выглядит немного странно : база данных предназначена не для форматирования, а для хранения, обработки и агрегирования данных . Рендеринг должен выполняться шаблоном, а не базой данных / моделями.
2. На самом деле я извлекаю больше полей, прежде чем передавать их в представление, и я подумал, что это будет более эффективно, если данные будут поступать уже отформатированными.
3. ну, обычно это не узкое место. Идея Python заключается в том, что время разработчика дороже, чем время обработки . Другими словами, следует сосредоточиться на большом oh и количестве запросов, а не на нескольких циклах, поскольку это стоит разработчикам больших денег, чтобы получить их правильно, и часто «выигрыш» очень ограничен. Наем нового разработчика обходится дорого, покупка новой машины обходится дешево.
4. Кроме того, в Django уже встроено много инструментов. Например, для форматирования даты и времени в языковом стандарте пользователя. Вы можете использовать
|date
фильтр шаблонов для фильтрации его в определенном формате, но вы также можете использовать языковой стандарт пользователя, так что немецкий пользователь увидит дату, отформатированную в соответствии с немецкими стандартами, а мексиканский пользователь — по мексиканским стандартам.5. Вы установили поддержку часовых поясов в MariaDB? (Использование mysql_tzinfo_to_sql)?