在Django中,当您有一个父类和多个继承它的子类时,通常会通过parentclass.childclass1_set或parentclass.childclass2_set访问子类,但如果我不知道我想要的特定子类的名称怎么办?
有没有一种方法可以在不知道子类名称的情况下获得父类->子类方向上的相关对象?
发布于 2009-05-30 06:02:24
在Python语言中,给定一个(“新风格”)类X,您可以使用X.__subclasses__()
获得它的(直接)子类,它返回一个类对象列表。(如果您想要“更多的后代”,您还必须在每个直接子类上调用__subclasses__
,等等--如果您需要有关如何在Python语言中有效地做到这一点的帮助,请尽管问!)。
一旦您以某种方式确定了感兴趣的子类(可能是所有子类,如果需要所有子类的实例,等等),getattr(parentclass,'%s_set' % childclass.__name__)
应该会提供帮助(如果子类的名称是'foo'
,这就像访问parentclass.foo_set
一样--不多也不少)。同样,如果您需要澄清或示例,请提出!
发布于 2009-05-30 22:01:08
Carl的解决方案是一个很好的解决方案,如果有多个相关的子类,这里有一种手动完成的方法:
def get_children(self):
rel_objs = self._meta.get_all_related_objects()
return [getattr(self, x.get_accessor_name()) for x in rel_objs if x.model != type(self)]
它使用了_meta之外的一个函数,该函数不能保证随着django的发展而稳定,但它做到了这一点,如果需要的话,可以在飞行中使用。
发布于 2009-06-09 22:20:31
事实证明,我真正需要的是:
Model inheritance with content type and inheritance-aware manager
这对我来说非常有效。不过,还是要感谢其他所有人。光看你的答案我就学到了很多!
https://stackoverflow.com/questions/929029
复制相似问题