Django - 如何使用MTI从父类对象获取子类型对象?

时间:2016-11-09 18:35:57

标签: python django inheritance multi-table-inheritance

我有一个函数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.

2 个答案:

答案 0 :(得分:1)

我认为这不是检查它是什么类型的孩子的最佳方式,或者至少是最简单的方式。

我猜你有自定义方法来获取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

答案 1 :(得分:0)

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

extension UITableViewCell {
    func tableView() -> UITableView? {
        var currentView: UIView = self
        while let superView = currentView.superview {
            if superView is UITableView {
                return (superView as! UITableView)
            }
            currentView = superView
        }
        return nil
    }
}

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

另外我会建议你考虑django两个范围的建议:

  

作者和许多其他开发人员认为多表不一致,有时称为“具体的不安”,这是一件坏事。我们强烈反对使用它。