get_model() vs from .models import somemodelname

时间:2015-09-25 16:36:44

标签: django django-models

What is/are the best practices to use get_model() and when should it be imported ?

Ref: https://docs.djangoproject.com/en/1.8/ref/applications/

2 个答案:

答案 0 :(得分:1)

当您需要动态获取模型类时,通常使用get_model()

一个实际示例:在为迁移编写RunPython操作时,您将app注册表作为其中一个参数,并使用apps.get_model('TheModel')导入历史模型。

另一个示例:您有一个具有动态构建的序列化程序的应用程序,并且您将Meta.model设置为您使用get_model()获得的类。

另一个例子是使用AppConfig.ready()self.get_model()中导入模型。

要记住,如果您使用的是AppConfig.get_model()apps.get_models(),则只有在应用程序注册表完全填充后才能使用它们。

另一个选项(from .models import TheModel)只是在代码中的任何位置导入模型的默认方式。

这些只是一些例子,还有许多其他可能的情况。

答案 1 :(得分:-1)

我更喜欢,使用.models导入,因为这是获取模型对象的简单方法 但是如果你使用元类,也许是get_model,那将是最好的选择。

def get_model(self, app_label, model_name=None):
        """
        Returns the model matching the given app_label and model_name.

        As a shortcut, this function also accepts a single argument in the
        form <app_label>.<model_name>.

        model_name is case-insensitive.

        Raises LookupError if no application exists with this label, or no
        model exists with this name in the application. Raises ValueError if
        called with a single argument that doesn't contain exactly one dot.
        """
        self.check_models_ready()
        if model_name is None:
            app_label, model_name = app_label.split('.')
        return self.get_app_config(app_label).get_model(model_name.lower())

也许这个SO POST也可以提供帮助。