2017-09-25 8 views
0

그래 픽과 함께 제공되는 relay.ConnectionField 구현은 기본적으로 쿼리를 페이지 매김하지 않습니다. 연결은 선택적으로 "첫 번째"또는 "마지막"을 사용하여 페이지 매김 될 수 있습니다. 연결에 노드가 많은 경우 실용적이지 않습니다. 예를 들어 페이지 매김을 강제하는 적절한 방법은 무엇입니까? 한 번에 100 개가 넘는 노드가 있습니까?그래 펜 릴레이에서 페이지 매김을 시행합니다. 연결 필드

+0

당신은 무엇을 의미합니까? 너 진짜 quey 안에 다음 2을 위해 묻고 싶니? –

답변

1

그래 핀은 불행히도 기본값을 지원하지 않습니다. 나는 그런 경우를위한 장식자를 만들었다. DEFAULT_PAGE_SIZEMAX_PAGE_SIZE을 적절히 설정하십시오. 데코레이터 자체에서 값을 받도록 조정할 수는 있지만 장고 및 장고 장고 설정과 함께 사용하고 있습니다.

DEFAULT_PAGE_SIZE = 10 
MAX_PAGE_SIZE = 100 

def limited_pagination(func): 
    ''' 
    Decorator for limiting the `first` and `last` pagination parameters. Uses 
    DEFAULT_PAGE_SIZE and MAX_PAGE_SIZE settings. Raises an exception when 
    values are invalid. 
    ''' 

    def wrapper(*args, **kwargs): 
     if 'first' in kwargs and 'last' in kwargs: 
      raise RuntimeError('Use either `first` or `last`, not both.') 

     for key in ('first', 'last'): 
      if key in kwargs: 
       try: 
        value = int(kwargs[key]) 
       except ValueError: 
        raise ValueError('`{}` must be an integer.'.format(key)) 

       if value < 0: 
        raise ValueError('`{}` must be 0 or greater.'.format(key)) 
       elif value > MAX_PAGE_SIZE: 
        raise ValueError(
         '`{}` must not be greater than {}.'.format(
          key, MAX_PAGE_SIZE 
         ) 
        ) 

       kwargs[key] = value 
       break # Break out of for loop to skip `else` branch. 

     else: 
      kwargs['first'] = DEFAULT_PAGE_SIZE 

     result = func(*args, **kwargs) 
     return result 

    return wrapper 

사용 예 :

@limited_pagination 
def resolve_whatever(self, info): 
    return [1, 2, 3, 4, 5]