Как вы догадались, я продолжаю тему денормализации и моей реализации композитных полей.
С момента прошлого поста я успел значительно улучшить базовый CompositionField и решить несколько концептуальных проблем.
Итак что же новое появилось:
- Сделал низкоуровневый
CFполноценным классом, который теперь удобно сабклассить и добавлять новый функционал - Появилось место для интроспекции. Присоединение к хост модели стало более интеллектуальным из-за возможного отложенного присоединения.
- Чуть-чуть изменился интерфейс - параметр
commitтеперь может быть задан для конкретного триггера. Это сугубо практическое изменение, которое помогло решить одну проблему с бесконечной рекурсией. - По совету Вани Сагалаева добавил генерацию
freeze_FOOметода, который включает/выключает обработку сигналов. Полезно когда надо обработать какие-то данные скопом, а потом так же скопом пересчитать денормализованные поля.
Я грозился написать высокоуровневые обертки над CF чтобы облегчить использование и упростить конечный интерфейс. Сегодня я расскажу о первом сабклассе CF: ForeignAttributeField - поле которое отслеживает изменения некого внешнего поля в связанном объекте. Причем, поле может находится на любом уровне вложенности связи, что иногда очень удобно. Как я уже писал в прошлый раз - поля объектов, на которые непосредственно ссылается модель, так денормализовывать смыла мало. Проще использовать select_related. Но если заветный атрибут лежит глубже и для доступа к нему надо приджоинить, допустим, пять таблиц, то тут уже другой расклад и ...