Как изменить аргументы подключения (после, до) в графен-питоне (реле)?

С помощью:

  • Django 3.x [Django-Filters 2.2.0, graphene-django 2.8.0, graphql-relay 2.0.1]
  • Vue 2.x [Vue-Apollo]

После применения некоторых фильтров (iContains и т. Д.) В моем поиске graphQL я попытался изменить или манипулировать connection_args нравиться firstили after. Я могу получить словарь на моем преобразователе, например{'first': 2, 'name__icontains': 'eagle'}со значениями, которые я ввел в IDE. Как видите (Пример 1 /def resolve_all_birds2), я уже использую это для логики. Но я не понимаю, где можно манипулировать состояниями GraphQLArgumentbefore. after first. last функция, которая идет с реле?

Пример 1

class ExtendedConnection(Connection):

    class Meta:
        abstract = True

    total_count = Int()
    edge_count = Int()

    def resolve_total_count(root, info, **kwargs):
        return root.length

    def resolve_edge_count(root, info, **kwargs):
        return len(root.edges)

class Birds2Node(DjangoObjectType):
    class Meta:
        model = Birds
        filter_fields =  {
            'id':  ['exact', 'icontains'],
            'name': ['exact', 'icontains', 'istartswith', 'iendswith'],
        }

        interfaces = (relay.Node, )
        connection_class = ExtendedConnection

    # --- CUSTOM FIELDS -->
    # pkey = _db primary key 
    pKey = Int()
    def resolve_pKey(parent, info):
        return parent.pk

    # qRank = Item Rank in Edge Array
    qRank = Int()
    def resolve_qRank(parent, info, **kwargs):
        return info.path[2]

class Birds2Query(ObjectType):
    birds2 = relay.Node.Field(Birds2Node)
    all_birds2 = DjangoFilterConnectionField(Birds2Node)


    def resolve_all_birds2(self, info, **kwargs):
        if 'name__icontains' in kwargs:
            nameIcon = kwargs['name__icontains']
            nameIconBool = bool(nameIcon.strip()) # if blanks turns False
            if nameIconBool == False: # has blanks         
                return Birds.objects.filter(name=None)
            pass

        if 'name__istartswith' in kwargs:
            nameIsta = kwargs['name__istartswith']
            nameIstaBool = bool(nameIsta.strip()) # if blanks turns False
            if nameIstaBool == False: # has blanks         
                return Birds.objects.filter(name=None)
            pass      

        return 

Например, в моей IDE я объявляю allBirds2(first: 2, name_Icontains: "a")... я могу получить эти значения с помощью своего преобразователя в виде словаря через **kwargs '' или через args def resolve_all_birds2(self, info, first, name_icontains): Пока все хорошо, я могу управлять своим ModelQuery, и он вернул только 2 на Edge.

Но представьте, что я хочу измениться first: 2 к first: 10в моем BackEnd? Могу ли я обновить словарь? Документация означает "да", но она кажется строго связанной с решаемыми вами типами объектов (полями). Например, я пробовал это...

Пример 2

def resolve_all_birds2(self, info, **kwargs):
     <...>            
    return {'first': '20', 'name__icontains': 'd' }

Выходная IDE: "message": "объект 'dict' не имеет атрибута 'model'"

Пример 3

def resolve_all_birds2(self, info, first, **kwargs):
     <...>            
    return f'20, {first}!'

Выходная IDE: "message": "имя 'first' не определено",


Вопрос

К сожалению, я обнаружил только манипуляции с параметрами в модельном запросе в документации по графену-питону. Итак, мой вопрос в том, как я могу манипулировать - в моем бэкэнде - значениями полей.before. after first. last, это реле предлагает и которые уже можно использовать в моей IDE. Должен ли я объявлять их дополнительно в моем DjangoObjectType или создавать настраиваемый узел для управления и изменения значений после того, как пользователь отправит запрос?

1 ответ

Добавление промежуточного программного обеспечения, вероятно, позволит изменить входные значения после выполнения запроса и до выполнения запроса. У Graphene есть пример: https://docs.graphene-python.org/en/latest/execution/middleware/

Однако из документации неясно (мне), какой из упомянутых параметров будет содержать firstполе, которым вы хотите управлять.

Однако подход промежуточного программного обеспечения не рекомендуется, потому что это нежелательный побочный эффект: https://github.com/graphql-python/graphene/issues/1285 .

Другие вопросы по тегам