首页 > 解决方案 > 检查某个模型实例是否实际上是某个模型的实例的最佳方法

问题描述

我正在尝试编写一个类,该类将我的应用程序中的模型实例作为其__init__. 在阅读该主题时,我偶然发现了这个问题:django:从该模型的实例中获取模型的最佳实践方法,它认为简单地使用type(instance)将是最好的方法。尽管立即使用它可能很诱人,但使用不是isinstance(instance, model)更好的解决方案吗?比如说(来自我自己的代码):

from app_name.models import Model1, Model2, ... ModelN
MODELS = (Model1, Model2 ... ModelN)

然后在类本身(在我的例子中,Graph)中,执行以下操作:

class Graph():
    model_instance = None
    model = None
    def __init__(self, model_instance):
        if isinstance(model_instance, MODELS):
            for a_model in MODELS:
                if isinstance(model_instance, a_model):
                    self.model = a_model
            self.model_instance = model_instance
...

作为初学者,我认为这是我能想到的最好方法,但也假设有更顺畅/更好的方法来做到这一点。可能是一种更“可读”的方式?优点?缺点?

感谢所有对此的反馈!谢谢!

对这个问题的整个上下文感兴趣的人,请查看我在 GitHub 上的项目:https ://github.com/VBoB13/TeachAdmin 您可以在此处找到包含上述代码的文件:https ://github.com/VBoB13/TeachAdmin /blob/master/teachadmin/graph.py

标签: pythonpython-3.xdjangodjango-models

解决方案


isinstance 文档

如果 object 参数是 classinfo 参数或其(直接、间接或虚拟)子类的实例,则返回 True。如果 object 不是给定类型的对象,则该函数始终返回 False。如果 classinfo 是类型对象的元组(或递归地,其他此类元组),如果 object 是任何类型的实例,则返回 True。如果 classinfo 不是类型或类型的元组和此类元组,则会引发 TypeError 异常。

这意味着如果您的模型是另一个模型的子类,它们都将被标记为超类的实例

例如 :

class A(object):
  pass

class B(A):
  pass

a = A()
b = B() 

print(isinstance(b,A))
# True
print(type(b)==type(A())
# False

总之,您应该使用type(),因为在 Django 中有多种使用模型继承的方法,这可能会产生错误的类型类结果


推荐阅读