我在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_parent
和table_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_obj
是ChildModel
个实例。我想用一种简洁的方式判断它,例如:
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
这种方法可行,但冗余太多,我的问题是否有最佳实现?
答案 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]
你绝对无法告诉哪个功能附加了什么。
因此,如果您遇到这种情况,则需要向表中添加一个包含该信息的新列,或者您正在编写的对象应包含该信息。