【问题标题】:Django: How do I get the model a model inherits from? [duplicate]Django:如何获取模型继承的模型? [复制]
【发布时间】:2011-03-11 21:01:48
【问题描述】:

可能重复:
get python class parent(s)

我有一个:

class Animal(models.Model):
    pass

class Cat(Aminal):
    pass

class StreetCat(Cat):
    pass

如何找出模型继承自的模型?

【问题讨论】:

  • 这里有django特有的元素。
  • 这不是重复的

标签: python django


【解决方案1】:

可以通过__base__获取python中的直接超类

>>> StreetCat.__base__ is Cat
>>> True

如果您有多个基类class Foo(A, B)__bases__ 将为您提供所有父类的元组


感谢 OP 更新:以下 django 方法不检索抽象基类,因为从技术上讲,这些是用于存储将每个继承模型与其父模型绑定的外键的内部使用方法。请注意!

Django 还间接为继承模型提供了一些帮助器,它们是纯 python 遍历超类的方法的快捷方式。

>>> StreetCat._meta.get_parent_list() 
[Out] : Set([Class Animal, Class Cat])

InheritedClass.parents 是所有父母的有序字典,因此如果您愿意,可以使用以下方法来获取最上层的父母:

>>> StreetCat._meta.parents.keys()[-1]

你也可以使用非 django 相关的方法,比如

>>> StreetCat.__mro__[-3] 
# once you know that BaseModel is an Object, and since all defined models subclass 
# the BaseModel, [-3] is the first class that subclasses models.Model

【讨论】:

  • 奇怪的是,我实际上看到了带有 dir() 的 get_parent_list() 并对其进行了测试,但只会返回直接孩子。
  • 你的意思是直接父母?这很奇怪!听起来这种方法的全部目的是获取所有祖先。 Docstring: """ 以列表的形式返回此模型的所有祖先的列表。用于确定某物是否是祖先,无论血统如何。"""
  • 啊,抽象模型好像被忽略了。
  • 啊,好点子,因为 parents 是一对一字段的排序字典,将每个继承的模型表绑定在一起。
  • 喜欢mro hack!一份完整整洁的清单,正如人们所期望的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2015-09-29
  • 2015-02-16
  • 2021-06-18
相关资源
最近更新 更多