1

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

Multi-Table Inheritance 上的Django 文档表明我可以通过使用子类的小写名称来做到这一点。例如,如果子类是 Concept,我可以执行以下操作:

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

但是,子类可以是概念、代码、公式或问题。是对每个子类使用 try/except 的唯一方法,例如:

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

2 回答 2

1

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

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

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

于 2016-11-09T21:34:00.913 回答
0

我推断 Chunk 对象具有优先级属性。如果这是真的,为了对 Chunks 的查询集进行排序,您应该使用:

Chunk.objects.order_by('-priority')

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

此外,我会建议您考虑 django 的两个范围的建议:

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

于 2016-11-09T20:49:31.130 回答