2017-09-25 89 views
0

石墨烯附帶的relay.ConnectionField實現不默認分頁查詢。 (連接可以選擇使用「first」或「last」分頁)。如果連接有大量節點,那麼這是不實際的。什麼是強制分頁的恰當方式一次不超過100個節點?在石墨烯繼電器中強制分頁。連接字段

+0

你是什麼意思?你想要問下兩個實際的球嗎? –

回答

1

不幸的是,石墨烯不支持默認值。我爲這種情況建立了自己的裝飾器。適當地設置DEFAULT_PAGE_SIZEMAX_PAGE_SIZE。可以調整來從裝飾器本身接收這些值,但是我將它與Django和ergo Django的設置一起使用。

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]