如何使用MTI从父类对象获得子类型对象?



我有一个函数get_priority(),它对父类(Chunk)中的所有对象进行排序,以获得最高的"优先级"对象。现在我想把相关的子类对象获取到超类对象。

关于多表继承的Django文档表明,我可以通过使用子类的小写名称来做到这一点。例如,如果子类是Concept,我可以这样做:

chunk = get_priority(Chunk.objects.all())
chunk.concept

但是,子类可以是Concept、Code、Formula或Problem。除了每个子类之外,使用try/是实现此目的的唯一方法,例如:

chunk = get_priority(Chunk.objects.all())
    try: 
         object = chunk.concept
    except:
        pass
    try:
        object = chunk.code
    except:
        pass
    # etc.

我认为这不是最好的方法来检查它是什么样的孩子,或者至少是最简单的。

我猜你有你的自定义方法来获得get_priority()上的Chunk优先级(我个人会把它放在Chunk对象管理器上),所以要得到正确的孩子,我会这样做:

chunk = get_priority(Chunk.objects.all())
object = None
for attr in ('concept', 'code', 'formula', 'problem'):
    if hasattr(chunk, attr):
        object = getattr(chunk, attr)

最后,您将在object变量或None中拥有孩子,如果它没有孩子,那么您可以在object中玩结果,如抛出异常,如果没有发现孩子或只是pass

我推断Chunk对象有一个优先级属性。如果这是真的,对于chunk的查询集排序,您应该使用:

Chunk.objects.order_by('-priority')

引用问题本身,看一下:指定父链接字段。您可以为所有子类设置相同的引用名称。

此外,我会建议你考虑django的两个作用域的建议:

多表继承,有时被称为"具体继承",被作者和许多其他开发人员认为是一件坏事。我们强烈建议不要使用它。

相关内容

  • 没有找到相关文章

最新更新