2

给定一般结构:

class Article(Page):
  body = RichTextField(...)
  search_fields = Page.search_fields + [index.SearchField('body')]

class ArticleFilter(FilterSet):
  search = SearchFilter()

  class Meta:
    model = Article
    fields = ['slug']

class Query(ObjectType):
  articles = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilter)

我想创建一个“SearchFilter”来公开 wagtail 搜索功能,因为我最终想通过 graphql 执行全文搜索,如下所示:

query {
  articles (search: "some text in a page") {
     edges {
        nodes {
           slug
        }
     }
  }
}

“搜索”不是 Django 模型上的字段,这就是我在 Django FilterSet 中创建自定义字段的原因。我的想法是做类似的事情:

class SearchFilter(CharFilter):
  def filter(self, qs, value):
     search_results = [r.pk for r in qs.search(value)]
     return self.get_method(qs)(pk__in=search_results)

但是,我很好奇是否有更好的模式更有效。至少,我想确保最后添加 SearchFilter(因此首先过滤搜索的查询)。

是否应该将“搜索”移出 FilterSet 并移到查询/节点/自定义连接中,如果是这样,我如何在“文章”中添加一个附加字段以将其视为解决文章的最后一步(即添加它到过滤器查询集的末尾)?如果这确实属于单独的连接,是否可以将该连接与 django 过滤器连接结合起来?

我认为这种通过石墨烯访问 Wagtail 搜索的模式已经存在,但是我没有运气在文档中找到它。

4

0 回答 0