Как импортировать из текущего приложения в Django без использования имени приложения?

В моем приложении много утверждений, подобных этому:

from my_app.model import Customer

Хотя это работает, я хотел бы иметь способ ссылаться на текущее приложение без жесткого кодирования имени приложения в импорте. Что-то вроде:

from keyword_for_current_app.model import Customer

Есть ли чистый способ достичь этого с помощью Django?

Почему бы вам не использовать только это?

from .model import Customer

Это скорее вопрос по python, чем по Django, поскольку он связан с тем, как работают импорты. Насколько я знаю, не существует способа сделать это так, как вы описали, если только вы не измените структуру ваших файлов.

Однако не исключено, что можно сделать что-то, используя функциональность Django для динамического импорта моделей. Вы можете заменить часть этого на importlib, если вам нужен более общий импорт, а не просто возврат класса модели:

from django.apps import apps

# option 1
model = apps.get_model('app.Model') 

# option 2
def get_model(model_name):
   return apps.get_model(f'myapp.{model_name}')

# option 3
def get_model(model_name):
   for model in apps.get_models():
      if model.__name__ == model_name:
         return model

Проблема с вариантом 1 для вашего случая заключается в том, что вам все еще нужно указывать имя приложения. Вариант 2 является улучшением, но вы жестко кодируете имя приложения в функции. Вариант 3 является лучшим, но может быть проблематичным, если у вас есть модели с одинаковым именем, но в разных приложениях/таблицах.

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

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