Как эффективно структурировать логику преобразования между парами моделей в 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 единиц измерения. Каждая пара может иметь более одной единицы измерения.

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