django:从该模型的实例中获取模型的最佳实践方法

时间:2010-01-14 13:53:16

标签: django

my_instance属于模型MyModel 我正在寻找一个好方法:

my_model = get_model_for_instance(my_instance)

我没有找到任何真正直接的方法来做到这一点。 到目前为止,我已经想出了这个:

from django.db.models import get_model

my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__)

这可以接受吗?它甚至是一种可靠的最佳实践方式吗? 还有_meta.object_name似乎与__class__.__name__相同。可以?好还是坏?如果是这样,为什么?

此外,如果应用标签在项目范围内多次出现,我怎么知道我得到了正确的模型,例如来自'django.contrib.auth'的'auth'并且还有'myproject.auth'吗? 这种情况会使get_model不可靠吗?

感谢任何提示/指示和经验分享!

3 个答案:

答案 0 :(得分:84)

my_model = type(my_instance)

要证明这一点,您可以创建另一个实例:

my_new_instance = type(my_instance)()

这就是为什么没有直接的方法,因为python对象已经有了这个功能。

<强>更新...

我喜欢使用type(x)的{​​{3}}。这与原始答案(x.__class__)相同,但我更喜欢使用函数来访问魔法属性。通过这种方式,我更喜欢使用vars(x)x.__dict__len(x)x.__len__等等。

更新了2 ...

对于延期实例(@Cerin在评论中提到),您可以通过instance._meta.proxy_for_model访问原始课程。

答案 1 :(得分:22)

my_new_instance = type(my_instance)()

答案 2 :(得分:6)

至少对于Django 1.11,这应该有效(也适用于延迟实例):

def get_model_for_instance(instance):
    return instance._meta.model

Source here