Django - 如何使用 MTI 从父 class 对象获取子类型对象?
Django - How can I get a child type object from a parent class object using MTI?
我有一个函数 get_priority()
,它对父 class(块)中的所有对象进行排序以获得最高的 'priority' 对象。现在我想将相关的 subclass 对象获取到 superclass 对象。
Django docs on Multi-Table Inheritance 表明我可以通过使用子class 的小写名称来做到这一点。例如,如果 subclass 是 Concept,我可以执行以下操作:
chunk = get_priority(Chunk.objects.all())
chunk.concept
但是,子class 可以是概念、代码、公式或问题。解决这个问题的唯一方法是对每个子 class 使用 try/except,例如:
chunk = get_priority(Chunk.objects.all())
try:
object = chunk.concept
except:
pass
try:
object = chunk.code
except:
pass
# etc.
我推断 Chunk 对象具有优先级属性。
如果这是真的,为了对 Chunks 的查询集进行排序,您应该使用:
Chunk.objects.order_by('-priority')
关于问题本身,请查看:Specifying the parent link field。您可以为所有子类设置相同的引用名称。
此外,我会建议您考虑 django 的两个作用域的建议:
Multi-table inherance , sometimes called "concrete inherance" is considered by the authors and many other developers to be a bad thing. We strongly recomend against using it.
我认为这不是检查 child 是哪种类型的最佳方法,或者至少不是最简单的方法。
我想你有自己的自定义方法来获得 get_priority()
上的块优先级(我个人会把它放在块 objects 管理器上),以便获得正确的 child我会这样做:
chunk = get_priority(Chunk.objects.all())
object = None
for attr in ('concept', 'code', 'formula', 'problem'):
if hasattr(chunk, attr):
object = getattr(chunk, attr)
最后你会在object
变量中有child,或者如果没有child则为None
,那么你可以在object
如果未找到 child 或仅 pass
.
则抛出异常
我有一个函数 get_priority()
,它对父 class(块)中的所有对象进行排序以获得最高的 'priority' 对象。现在我想将相关的 subclass 对象获取到 superclass 对象。
Django docs on Multi-Table Inheritance 表明我可以通过使用子class 的小写名称来做到这一点。例如,如果 subclass 是 Concept,我可以执行以下操作:
chunk = get_priority(Chunk.objects.all())
chunk.concept
但是,子class 可以是概念、代码、公式或问题。解决这个问题的唯一方法是对每个子 class 使用 try/except,例如:
chunk = get_priority(Chunk.objects.all())
try:
object = chunk.concept
except:
pass
try:
object = chunk.code
except:
pass
# etc.
我推断 Chunk 对象具有优先级属性。 如果这是真的,为了对 Chunks 的查询集进行排序,您应该使用:
Chunk.objects.order_by('-priority')
关于问题本身,请查看:Specifying the parent link field。您可以为所有子类设置相同的引用名称。
此外,我会建议您考虑 django 的两个作用域的建议:
Multi-table inherance , sometimes called "concrete inherance" is considered by the authors and many other developers to be a bad thing. We strongly recomend against using it.
我认为这不是检查 child 是哪种类型的最佳方法,或者至少不是最简单的方法。
我想你有自己的自定义方法来获得 get_priority()
上的块优先级(我个人会把它放在块 objects 管理器上),以便获得正确的 child我会这样做:
chunk = get_priority(Chunk.objects.all())
object = None
for attr in ('concept', 'code', 'formula', 'problem'):
if hasattr(chunk, attr):
object = getattr(chunk, attr)
最后你会在object
变量中有child,或者如果没有child则为None
,那么你可以在object
如果未找到 child 或仅 pass
.