【问题标题】:How to judge if a django model object is exactly a BaseClass instance?如何判断一个 django 模型对象是否正是 BaseClass 实例?
【发布时间】:2014-08-25 14:50:11
【问题描述】:

我在 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_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

这个方法可以,但是冗余太多,有没有最好的实现我的问题?

【问题讨论】:

  • 冗余过多是什么意思?
  • @Jonathan 我必须在模型类中手动定义一个函数,并在其中包含一个 try-except。

标签: python django class inheritance model


【解决方案1】:

您能否提供一个完整的最小工作示例?我从来没有用过 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]

你完全没有办法知道哪个函数附加了什么。

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

【讨论】:

  • 这是一个 django 问题,所以我认为您的回答没有帮助
  • 也许吧,但没人愿意回答。 Django 与否,这是 Python。 Django 不是某种会改变 Python 行为方式的插件:它只是一个构建在 Python 之上的 Python 模块。我写的不是 Django 特定的,而是 Python 特定的,所以它也应该适用于 Django。
  • 如果表中的“对象”只是原始数字,那么除了自己在某处写下这些信息外,您无法做任何事情来知道它们是什么写的。如果您放入表中的是序列化的类实例,那么您可以定义不同的类并使用isinstance。可能有 Django 内置函数,但它们应该归结为我提供的两种方法之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2012-10-16
相关资源
最近更新 更多