如何判断django模型对象是否恰好是BaseClass实例?

时间:2014-07-04 09:43:43

标签: python django class inheritance model

我在django中有ParentModel模型:

class ParentModel(models.Model):

    field_a = models.IntegerField()
    field_b = models.IntegerField()

    class Meta:
        db_table = 'table_parent'

之后我定义了一个超类ChildModel

class ChildModel(ParentModel):

    field_c = models.IntegerField()

    class Meta:
        db_table = 'table_child'

以上将在我的数据库中创建两个表,我们称之为table_parenttable_child

所以,现在我创建了两个实例:

first_obj = ParentModel.objects.create(...) # id=1
second_obj = ChildModel.objects.create(...) # id=2

它将创建两个对象,在table_parent中完全插入两行,在table_child中插入一行。

现在,如果我获取实例,但两者都是从ParentModel创建的:

first_obj = ParentModel.objects.get(id=1) # id=1
second_obj = ParentModel.objects.create(id=2) # id=2

因此,事实上,second_objChildModel个实例。我想用一种简洁的方式判断它,例如:

first_obj.is_exact_base() # I want it to be True
second_obj.is_exact_base() # I want it to be False

更多,我可能有多个ParentModel超级类,我希望它能在这种情况下运作良好。


我的努力:

class ParentModel(models.Model):

    ...

    def is_exact_base(self):
        try:
            child = self.childmodel
            return False
        except:
            return True

这种方法可行,但冗余太多,我的问题是否有最佳实现?

1 个答案:

答案 0 :(得分:0)

你能提供完整的最低工作范例吗?我从来没有使用过Django,我甚至看不到你想要做什么。

从python程序员的角度来看(对不起,我确信我并不了解所有内容),如果你想知道objectA是否是BaseClass的一个实例,你想要的是:

isinstance(objectA, BaseInstance)

如果这不适用于您的情况,那么Python无法区分它们。就像你这样做:

def f(a, b):
    a.append(b)

def g(a, b):
    a.append(b)

a = []
f(a, 0)
g(a, 1)

>>> print(a)
[0, 1]

你绝对无法告诉哪个功能附加了什么。

因此,如果您遇到这种情况,则需要向表中添加一个包含该信息的新列,或者您正在编写的对象应包含该信息。