【问题标题】:Django - How can I get a child type object from a parent class object using MTI?Django - 如何使用 MTI 从父类对象获取子类型对象?
【发布时间】:2023-03-14 19:06:01
【问题描述】:

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

Django docs on Multi-Table Inheritance 表明我可以通过使用子类的小写名称来做到这一点。例如,如果子类是 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.

【问题讨论】:

    标签: python django inheritance multi-table-inheritance


    【解决方案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.

    【讨论】:

      【解决方案2】:

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

      Chunk.objects.order_by('-priority')
      

      关于问题本身,请查看:Specifying the parent link field。您可以为所有子类设置相同的引用名称。

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

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

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 2022-12-15
        • 2020-04-14
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多