代码之家  ›  专栏  ›  技术社区  ›  Cerzi

摇摆单元测试:添加子页面将其转换为基类型

  •  1
  • Cerzi  · 技术社区  · 8 年前

    >> root = FrontPage.add_root(instance=FrontPageFactory.build())
    >> root
    <FrontPage: article0>
    
    >> root.add_child(instance=ArticlePageFactory.build())
    <ArticlePage: article1>
    
    >> root.get_tree()
    <PageQuerySet [<Page: article0>, <Page: article1>]>
    

    “article0”在页面树中从类型ArticlePage变为类型Page。这个页面对象是对ArticlePage的引用,并且有一个我不知道的方法来获取它,还是我在这里遗漏了一些明显的东西?

    同时,我通过将添加的文章页面存储在一个单独的列表中来解决这个问题,但我真的很想了解这里发生了什么。

    1 回复  |  直到 8 年前
        1
  •  3
  •   gasman    8 年前

    Wagtail使用 multi-table inheritance 表示页面:所有页面类型通用的字段(例如标题和slug,以及用于跟踪页面树内位置等内容的各种内部字段)都是基础的一部分 Page ArticlePage 分别存在于各自的表中。检索页面实例时,它可以以两种可能的形式之一存在,具体取决于检索它所使用的模型:

    >> page = Page.objects.get(title='article1')
    <Page: article1>
    

    这是一个基本的 page.title ,而不是上定义的字段/方法 .

    >> page = ArticlePage.objects.get(title='article1')
    <ArticlePage: article1>
    

    这是一个完整的 文章页码 page.body .

    遍历页面树的操作,例如 get_tree() get_children() ,始终为您提供基本 实例。这是出于性能原因-无法提前知道要返回哪些页面类型,因此它无法判断要查询哪些表才能检索完整的页面数据。

    你可以从一个人开始 通过访问 specific 属性-这将产生一个额外的数据库查询:

    >> page = Page.objects.get(title='article1')
    >> page.specific
    <ArticlePage: article1>
    

    specific() a上的方法 PageQuerySet

    >> root.get_tree().specific()
    <PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]>