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,但不会帮我查询。

  • 按子类型过滤:给定一个WidgetQuerySet ,我需要过滤给定的所有“子类型”。 我意识到你通常只是查询子模型,但这是为Widget设置的自定义查询集,我需要根据“子类”的类型执行不同的过滤。 换句话说,我想要这样的Widget.objects.filter(isinstance(child, WorkWidget)) ,我Widget.objects.filter(isinstance(child, WorkWidget))这是不可能的。 目前,我通过检查Widget的一些不同属性来“鸭子打字”(我在问题1中的困境提供了这样一个功能)。 如果必须的话,清理者将存储明确的.type字段。

  • 我没有找到这种明确的一对一映射的简单例子。


  • 你是对的,相关的名字必须有所不同。
  • 只需检查给定子类型的存在:

    Widget.objects.select_related( 'workwidget')。过滤器(workwidget__isnull =假)

  • 链接地址: http://www.djcxy.com/p/60211.html

    上一篇: Django object composition with OneToOneField

    下一篇: Get the ORM that is created by Django