在 Python 中动态生成导入,专门用于 Django 模型

问题描述 投票:0回答:4

给定一个 django 模型,我如何为它自动生成有效的导入?我有一个严格的内部函数(只有开发人员会使用它),它接受一个模型并返回一些关于它的信息。问题是,我不知道如何动态导入东西:

例如,我的应用程序结构可能是:

-myproject
    --books
    --music

功能:

def my_func(Model):
    from appname.models import Model
    ## Rest of function here ##

有没有一种方法可以根据模型自动生成导入?我正在考虑访问 _meta 属性以获取 app_label 但显然,需要导入才能访问 Model._meta。任何想法将不胜感激。

python database django schema models
4个回答
4
投票

我认为

get_model
是你需要的。

from django.db.models.loading import get_model
model = get_model('appname', 'ModelName')

现在你可以做到了。

objects = model.objects.all()

1
投票

您可以使用

importlib
动态导入模块,这允许您将包指定为第二个参数。

import importlib
mod = importlib.import_module('modulename', 'packagename')

如果你想让你的模块名称与你的模型类匹配,你可以试试这个:

ModelClass.__name__

0
投票

使用

__import__
函数并将模型作为字符串传入。

def my_func(Model):
    modelVar = __import__("appname.models"+Model)

0
投票

这是对 Rag Sagar 回答的更新。

get_model
的位置在当前的 django 版本(4.1,截至撰写本文时)上有所不同。

>>> from django.apps import apps
>>> model = apps.get_model("app_label", "ModelName")
>>> model
<class 'app_label.models.ModelName'>

或使用替代语法:

>>> model = apps.get_model("app_label.modelname")    
>>> model
<class 'app_label.models.ModelName'>

文档参考:https://docs.djangoproject.com/en/4.1/ref/applications/#django.apps.apps.get_model

© www.soinside.com 2019 - 2024. All rights reserved.