首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不知道子类名称的情况下访问django中对象的子类?

如何在不知道子类名称的情况下访问django中对象的子类?
EN

Stack Overflow用户
提问于 2009-05-30 04:52:56
回答 7查看 33.8K关注 0票数 84

在Django中,当您有一个父类和多个继承它的子类时,通常会通过parentclass.childclass1_set或parentclass.childclass2_set访问子类,但如果我不知道我想要的特定子类的名称怎么办?

有没有一种方法可以在不知道子类名称的情况下获得父类->子类方向上的相关对象?

EN

回答 7

Stack Overflow用户

发布于 2009-05-30 06:02:24

在Python语言中,给定一个(“新风格”)类X,您可以使用X.__subclasses__()获得它的(直接)子类,它返回一个类对象列表。(如果您想要“更多的后代”,您还必须在每个直接子类上调用__subclasses__,等等--如果您需要有关如何在Python语言中有效地做到这一点的帮助,请尽管问!)。

一旦您以某种方式确定了感兴趣的子类(可能是所有子类,如果需要所有子类的实例,等等),getattr(parentclass,'%s_set' % childclass.__name__)应该会提供帮助(如果子类的名称是'foo',这就像访问parentclass.foo_set一样--不多也不少)。同样,如果您需要澄清或示例,请提出!

票数 24
EN

Stack Overflow用户

发布于 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的发展而稳定,但它做到了这一点,如果需要的话,可以在飞行中使用。

票数 5
EN

Stack Overflow用户

发布于 2009-06-09 22:20:31

事实证明,我真正需要的是:

Model inheritance with content type and inheritance-aware manager

这对我来说非常有效。不过,还是要感谢其他所有人。光看你的答案我就学到了很多!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/929029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档