【问题标题】:How to set up a chain/tree of models with ForeignKeys如何使用 ForeignKeys 建立模型链/树
【发布时间】:2012-06-20 21:40:21
【问题描述】:

我不知道我是否正确地表达了这个问题。如果我应该将其称为其他名称,请随时发表评论。

但这就是我想要完成的,一些模型的层次结构如下:

Page <--- SubPage.1 <--- SubPage.1.1 <--- SubPage.1.1.1 ...
  |__________|                 ^                           ...and so on
  |                            |-- SubPage.1.1.2 ...
  |                            
 tags #m2m or some other object
      #with foreign key relation 

其他一些属性:

  1. 子页面包含页面拥有的所有相同信息
  2. 所有指向 Page 的外键和 m2m 字段也适用于 SubPage
  3. 我希望能够快速访问父子页面和根页面,而不需要太多的 db hits

那么,坚持 DRY 理念的最佳方式是什么?

这就是我所拥有的:

class Page(models.Model):
    ....

class SubPage(Page):
    parent = models.ForeignKey('self', related_name = 'subpage_set', blank = 'True')
    root = models.ForeignKey(Page, related_name = 'rootpage_set')

我不喜欢这种方式,但有几个原因。 1) SubPage.root 是重复的,只是为了快速找到Page。 2)保存SubPage 对象也保存Page 对象,我想将它们分开。

感谢您的帮助,谢谢

【问题讨论】:

    标签: django django-models foreign-keys dry


    【解决方案1】:

    使用django-mpttdjango-treebeard。我个人更喜欢 django-mptt,但它们都是能够很好地处理关系层次结构的成熟项目。

    【讨论】:

    • +1 到 django-mptt。它很简洁,并且很好地解释了它如何管理层次结构的幕后方面。另外,与您的解决方案相比,它允许您在一条 SQL 语句中简单地查询“Subpage.1 下的所有页面”或“SubPage.1.1.2 的所有祖先”,而不必执行多个请求(回想一下,SQL 不会为你处理递归)。
    • 太棒了,正是我想要的。感恩节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2020-11-11
    • 2015-06-09
    • 2019-11-18
    • 2018-06-21
    • 2010-10-15
    相关资源
    最近更新 更多