Лучше ли иметь явное поле в модели django или вычислять по запросу?

Если у меня есть модель django, в которой есть поле 'order' (целочисленное поле, которое отслеживает изменяемый порядок конкретного экземпляра модели среди всех экземпляров модели), и я также хочу отслеживать позицию экземпляра модели на основе этого порядка ('first'/'mid'/'last'), лучше ли иметь другое поле модели под названием 'position', которое я пересчитываю и сохраняю каждый раз, когда происходит изменение порядка, или мне следует иметь метод модели под названием 'get_position', который я вызываю каждый раз, когда мне нужна позиция. Я пытаюсь понять, что эффективнее. Хотя мне не понадобится информация о позиции каждый раз, когда я создаю/удаляю/изменяю экземпляр заказа, мне понадобится это поле позиции довольно часто в моих шаблонах.

Обычно избегают создания дополнительных полей базы данных, если что-то может быть вычислено из данных, уже имеющихся в базе данных, чтобы избежать избыточности и уменьшить векторы ошибок.

Метод может работать, если он относительно прост, получая свое значение из существующего поля в записи. Если ему необходимо искать сравнительные значения из других записей, это будет проблемой эффективности.

Поскольку вы упоминаете использование именно в шаблонах, возможно, стоит посмотреть, смогут ли встроенные модули шаблонов удовлетворить ваши требования.

Допустим, ваш набор записей уже упорядочен по полю 'order', например, MyRecords.objects.order_by('order')

При переходе по MyRecords_context в шаблоне с помощью цикла for можно проверить {{if forloop.first}} или {{if forloop.last }}. - Вы также можете обратиться к MyRecords_context.first() и .last(), чтобы выделить их. Если вам нужен конкретный индекс записи в конкретном наборе записей для вашего шаблона, вы можете обратиться к {{ forloop.counter }}, например, {{if forloop.counter < 10 and forloop.counter > 5}} или {{if forloop.counter == 5}}

Преимущество этого подхода в том, что если вы отфильтровали подмножество записей, вы все равно обращаетесь к первой, последней или N-ой записи набора записей, даже если они не являются первой и последней в целом в вашем поле абсолютной позиции, и без дополнительных вызовов db.

Вернуться на верх