# 페이지 QuerySet 참조 {class}`~wagtail.models.Page` 에서 상속하는 모든 모델은 `.objects` 속성에서 액세스할 수 있는 추가 QuerySet 메서드를 제공합니다. ## 예시 ### 라이브 페이지만 선택 ```python live_pages = Page.objects.live() ``` ### events_index의 하위인 게시된 EventPage 선택 ```python events = EventPage.objects.live().descendant_of(events_index) ``` ### 메뉴 항목 목록 가져오기 ```python # 이것은 `show_in_menus` 가 설정된 홈페이지의 라이브 자식 QuerySet을 가져옵니다. menu_items = homepage.get_children().live().in_menu() ``` ## 참조 ```{eval-rst} .. automodule:: wagtail.query .. autoclass:: PageQuerySet .. automethod:: live 예시: .. code-block:: python published_pages = Page.objects.live() .. automethod:: not_live 예시: .. code-block:: python unpublished_pages = Page.objects.not_live() .. automethod:: in_menu 예시: .. code-block:: python # 홈페이지의 자식인 라이브 페이지에서 메뉴 빌드 menu_items = homepage.get_children().live().in_menu() .. note:: 페이지를 메뉴에 넣으려면 show_in_menus 플래그를 true로 설정하십시오. .. code-block:: python # 'my_page'를 메뉴에 추가 my_page.show_in_menus = True .. automethod:: not_in_menu .. automethod:: in_site 예시: .. code-block:: python # 현재 사이트의 모든 EventPage 가져오기 site = Site.find_for_request(request) site_events = EventPage.objects.in_site(site) .. automethod:: page 예시: .. code-block:: python # QuerySet에 추가 페이지 추가 new_queryset = old_queryset | Page.objects.page(page_to_add) .. automethod:: not_page 예시: .. code-block:: python # QuerySet에서 페이지 제거 new_queryset = old_queryset & Page.objects.not_page(page_to_remove) .. automethod:: descendant_of 예시: .. code-block:: python # special_events Page 아래에 있는 EventPage 가져오기 special_events = EventPage.objects.descendant_of(special_events_index) # 다른 방법 special_events = special_events_index.get_descendants() .. automethod:: not_descendant_of 예시: .. code-block:: python # archived_events Page 아래에 없는 EventPage 가져오기 non_archived_events = EventPage.objects.not_descendant_of(archived_events_index) .. automethod:: child_of 예시: .. code-block:: python # 섹션 목록 가져오기 sections = Page.objects.child_of(homepage) # 다른 방법 sections = homepage.get_children() .. automethod:: not_child_of .. automethod:: ancestor_of 예시: .. code-block:: python # 현재 섹션 가져오기 current_section = Page.objects.ancestor_of(current_page).child_of(homepage).first() # 다른 방법 current_section = current_page.get_ancestors().child_of(homepage).first() .. automethod:: not_ancestor_of 예시: .. code-block:: python # 다른 섹션 가져오기 other_sections = Page.objects.not_ancestor_of(current_page).child_of(homepage) .. automethod:: parent_of .. automethod:: not_parent_of .. automethod:: sibling_of 예시: .. code-block:: python # 형제 목록 가져오기 siblings = Page.objects.sibling_of(current_page) # 다른 방법 siblings = current_page.get_siblings() .. automethod:: not_sibling_of .. automethod:: public 참조: :ref:`private_pages` .. note:: 게시되지 않은 페이지는 필터링하지 않습니다. 게시된 공개 페이지만 원하면 ``.live().public()`` 을 사용하십시오. 예시: .. code-block:: python # 공개적으로 볼 수 있는 모든 페이지 찾기 all_pages = Page.objects.live().public() .. automethod:: not_public .. automethod:: private .. automethod:: search 참조: :ref:`wagtailsearch_searching_pages` 예시: .. code-block:: python # 미래 이벤트 검색 results = EventPage.objects.live().filter(date__gt=timezone.now()).search("Hello") .. automethod:: type 예시: .. code-block:: python # AbstractEmailForm 또는 그 서브클래스 유형의 모든 페이지 찾기 form_pages = Page.objects.type(AbstractEmailForm) # AbstractEmailForm 또는 AbstractEventPage 또는 그 서브클래스 유형의 모든 페이지 찾기 form_and_event_pages = Page.objects.type(AbstractEmailForm, AbstractEventPage) .. automethod:: not_type .. automethod:: exact_type 예시: .. code-block:: python # 정확히 EventPage 유형의 모든 페이지 찾기 event_pages = Page.objects.exact_type(EventPage) # 정확히 EventPage 또는 NewsPage 유형의 모든 페이지 찾기 news_and_events_pages = Page.objects.exact_type(EventPage, NewsPage) .. note:: 단일 유형의 페이지에만 관심이 있다면, 특정 모델의 관리자를 사용하여 쿼리셋을 가져오는 것이 더 명확하고(종종 더 효율적입니다). 예시: .. code-block:: python event_pages = EventPage.objects.all() .. automethod:: not_exact_type 예시: .. code-block:: python # 먼저 모든 뉴스 및 이벤트 페이지 찾기 news_and_events = Page.objects.type(NewsPage, EventPage) # 이제 EventPage 또는 NewsPage의 정확한 유형을 가진 페이지를 제외하고, # 더 '전문적인' 유형의 인스턴스만 남깁니다. specialised_news_and_events = news_and_events.not_exact_type(NewsPage, EventPage) .. automethod:: unpublish 예시: .. code-block:: python # current_page 및 모든 자식 게시 취소 Page.objects.descendant_of(current_page, inclusive=True).unpublish() .. automethod:: specific 예시: .. code-block:: python # 최소한의 데이터베이스 쿼리로 홈페이지의 모든 자식의 특정 인스턴스를 가져옵니다. homepage.get_children().specific() 참조: :py:attr:`Page.specific ` .. automethod:: defer_streamfields 예시: .. code-block:: python # 특정 모델에 대한 StreamField 값을 가져오지 않도록 쿼리셋에 적용 EventPage.objects.all().defer_streamfields() # 또는 모든 모델에 대한 StreamField 값을 가져오지 않도록 specific()과 결합 homepage.get_children().defer_streamfields().specific() .. automethod:: first_common_ancestor .. automethod:: select_related .. automethod:: prefetch_related #### 성능 고려 사항 `prefetch_related()` 의 일반적인 사용은 제공된 각 `lookups` 에 대해 추가 데이터베이스 쿼리가 실행됩니다. 그러나 `for_specific_subqueries=True` 와 결합하면 이 추가 데이터베이스 쿼리 수는 결과의 각 특정 유형에 대해 곱해집니다. 소수의 객체만 가져오거나 결과의 유형 편차가 높을 가능성이 있는 경우, 이러한 추가 쿼리를 만드는 추가 오버헤드가 실제로 성능에 부정적인 영향을 미칠 수 있습니다. `for_specific_subqueries=True` 와 함께 `prefetch_related()` 를 사용하는 것은 많은 수의 결과가 필요하거나 유형 편차가 어떤 식으로든 제한되는 경우에만 사용해야 합니다. 예를 들어, 부모에 `allow_subtypes` 가 설정되어 결과가 소수의 페이지 유형으로 제한되는 자식 페이지 목록을 렌더링할 때. 또는 `type()` 또는 `not_type()` 필터가 쿼리셋을 소수의 특정 유형으로 제한하기 위해 적용된 경우. ```