Привет, я Иван Елфимов, Developer Advocate в Ostrovok.ru. Расскажу про наш переход на Django 5.0.
4 марта вышел третий security release, когда мы обычно переходим на новые версии библиотек. Мы были готовы к переходу: проверили на декабрьском 5.0.0. что могло сломаться. Из-за некоторых обновлений нам пришлось менять код:
Раньше мы использовали
nulls_last=False
. Теперьnulls_first
иnulls_last
могут бытьTrue
илиNone
, поэтому в некоторых местах вместо значений по умолчанию теперьnulls_last = None
:
- nulls_last = False
+ nulls_last = None
if ordering_by == OrderingField.FIELD_START_AT:
nulls_last = True
В сигналах появился новый тип асинхронных ресиверов (
async_receivers
), мы добавили его во вспомогательный классSignalBlocker
, которым временно выключаем сигналы.Теперь надо явно указывать
USE_TZ = False
, но это не проблема, мы не используем таймзоны в нашем сервисе.Если после
refresh_from_db
надо дальше по коду использовать закешированные значения из базы данных, появился такой хак:
my_model_obj._meta.private_fields = []
my_model_obj.refresh_from_db()
Новинка, которой воспользуемся в будущем, — расчетные поля по умолчанию (default
) в БД. Есть сценарии, где нужно, чтобы поле по умолчанию было не скаляром, а содержало расчётное значение на основе других полей.