Django的对象组成与OneToOneField
正如其他问题所述,像Two Scoops这样的Django专家建议使用显式的OneToOneFields而不是多表继承来避免隐式联接的性能损失。 我试图遵循这种方法,而我的设计实际上是对象组合,但有几个问题。 所有这三个都是具体的表格。
class Widget:
... many shared fields ...
class FunWidget:
parent = models.OneToOneField(Widget, related_name='child', primary_key=True)
... fun-specific fields ...
class WorkWidget:
parent = models.OneToOneField(Widget, related_name='child', primary_key=True)
... work-specific fields ...
我的问题是:
相关名称:给定一个Widget
,使用相同的名称来引用它的相关子类型会很好,例如Widget.child
。 但是,我得到了一个Reverse query name for ... clashes with reverse query name for ...
错误的Reverse query name for ... clashes with reverse query name for ...
。 因此,看来我必须提供不同related_name
S,以便给定Widget
将有一张.funwidget
或.workwidget
。 为了推广我公司可提供的方法Widget.child()
检查每一个可能的related_name
S,但不会帮我查询。
按子类型过滤:给定一个Widget
的QuerySet
,我需要过滤给定的所有“子类型”。 我意识到你通常只是查询子模型,但这是为Widget
设置的自定义查询集,我需要根据“子类”的类型执行不同的过滤。 换句话说,我想要这样的Widget.objects.filter(isinstance(child, WorkWidget))
,我Widget.objects.filter(isinstance(child, WorkWidget))
这是不可能的。 目前,我通过检查Widget的一些不同属性来“鸭子打字”(我在问题1中的困境提供了这样一个功能)。 如果必须的话,清理者将存储明确的.type
字段。
我没有找到这种明确的一对一映射的简单例子。
只需检查给定子类型的存在:
Widget.objects.select_related( 'workwidget')。过滤器(workwidget__isnull =假)