Как импортировать из текущего приложения в 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 является лучшим, но может быть проблематичным, если у вас есть модели с одинаковым именем, но в разных приложениях/таблицах.
По моему мнению, вы должны импортировать каждую модель явно в верхней части ваших файлов. Это наиболее чистый и читабельный способ - если кто-то будет читать ваш код, он будет ожидать, что модели будут импортированы именно таким образом.