Добавить свойства к модели из другого приложения в django? (расширить модель из другого приложения)

У меня есть приложение (с именем essence), которое я использую в нескольких проектах (это общее приложение с одной моделью User и моделью Location, которые используются в нескольких моих проектах)

Модель Location выглядит примерно так:

class Location(models.Model):
    name = models.CharField(max_length=50)
    alternate_location_id = models.IntegerField()

    class Meta(object):
        ordering = ["name"]

    def __str__(self):
        return self.name

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

Функция возвращает словарь, который выглядит следующим образом:

{
    "location_id": location.id, 
    "location_name": location.name,
    "alternate_location_id": location.alternate_location_id,
    "location_current_position_count": position_count,
    "location_current_position_average": position_average,
    "location_change": location_position_change,
}

Три переменные, перечисленные в этом словаре (position_count, position_average и location_position_change) вычисляются с помощью различных запросов других связанных моделей в функции (которые не используют aggregate/annotate, но могли бы/должны были бы - отсюда мой рефакторинг сейчас)

Я хотел бы избавиться от этой функции и просто сделать эти другие переменные атрибутами/свойствами самой модели Location, чтобы мне не приходилось так часто обращаться к БД.

Мой вопрос - где это должно жить?

Вариант 1 выглядит следующим образом: расширить модель Location в приложении positions и сделать это там?

Но тогда мне придется переписать всю логику приложения, чтобы использовать модель positions.Location вместо модели essence.Location - а я хотел бы избежать миграций и необходимости затрагивать так много различных участков кода, если это возможно.

Есть ли другие варианты? Возможно, уровень "сервиса"? ( о чем говорилось здесь)

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

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