Как эффективно структурировать логику преобразования между парами моделей в Django?
Я работаю над приложением на Django, где мне нужно обрабатывать преобразования между парами моделей с разными единицами измерения. Эти модели похожи на задачи, которые пользователь должен выполнить, а преобразование единиц между двумя задачами пытается сопоставить усилия, затраченные на выполнение первой задачи, со вторыми, измеренными в единицах. Мой текущий подход использует отображение пар моделей (около 30 возможных комбинаций) и применяет одно из нескольких вычислений к значению, связанному с from_model, на основе пары и связанной единицы измерения. Мне был предоставлен предопределенный список отображений и вычислений для различных единиц измерения каждой задачи.
Контекст:
Например, вот две задачи:
Задание A: Напиши 1 страницу от руки карандашом (здесь указана величина и единица измерения).
Задание B: Напечатать страницы с помощью компьютера (не содержит значения, но содержит единицу измерения)
Преобразование из модели A в модель B должно принимать значение (например, 1 страница) и возвращать эквивалент по затратам (например, набор 3 страниц может считаться эквивалентным написанию 1 страницы от руки).
Вот моя текущая реализация:
from django.test import TestCase
from app.myapp.models import MyModel
def convert_units(value, from_model, to_model, unit, conversion_map):
try:
conversion_function = conversion_map[(from_model, to_model)][unit]
return conversion_function(value)
except KeyError:
return None
class ConversionTest(TestCase):
def setUp(self):
self.model_a = MyModel.objects.create(name='writing_by_hand')
self.model_b = MyModel.objects.create(name='typing')
self.conversion_map = {
('writing_by_hand', 'typing'): {
'pages': lambda x: x * 3
},
}
def test_convert_units(self):
value = 1
model_a_to_model_b = convert_units(value, self.model_a.name, self.model_b.name, 'pages', self.conversion_map)
self.assertEqual(model_a_to_model_b, value * 3)
self.assertIsNotNone(model_a_to_model_b)
Есть ли более эффективный или удобный для обслуживания способ структурировать эту логику преобразования? Реальное приложение имеет несколько десятков пар и 2-5 единиц измерения. Каждая пара может иметь более одной единицы измерения.