首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在石墨烯-python(中继)中更改连接参数(之后,之前)?

如何在石墨烯-python(中继)中更改连接参数(之后,之前)?
EN

Stack Overflow用户
提问于 2020-02-15 00:51:37
回答 1查看 1.1K关注 0票数 1

使用:

  • Django 3.x django-过滤器2.2.0,石墨烯-django 2.8.0,石墨2.x继电器2.0.1
  • Vue 2.x Vue-阿波罗

在应用了一些过滤器(iContains等)之后在我的graphQL搜索中,我试图更改或操作connection_args,比如firstafter。我可以在我的解析器(如{'first': 2, 'name__icontains': 'eagle'} )上获取一个字典,其中包含我在IDE中输入的值。如您所见(示例1 /def resolve_all_birds2),我已经将其用于逻辑。但我不明白在哪里操作beforebefore状态。after first.继电器附带的last函数是什么?

示例1

代码语言:javascript
复制
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个。

但是想象一下,我想在我的first: 2中将first: 10改为first: 10吗?我能更新字典吗?文档的意思是“是”,但它似乎与您解析的ObjectTypes (字段)严格相关。比如我试过这个..。

示例2

代码语言:javascript
复制
def resolve_all_birds2(self, info, **kwargs):
     <...>            
    return {'first': '20', 'name__icontains': 'd' }

Output IDE: "message":"'dict‘对象没有属性'model'“

示例3

代码语言:javascript
复制
def resolve_all_birds2(self, info, first, **kwargs):
     <...>            
    return f'20, {first}!'

Output IDE: "message":"name 'first‘未定义“,

问题

不幸的是,我在graphene-python文档中只发现了对模型查询的参数操作。因此,我的问题是如何在后端操作字段before的值。after first.last,该中继提供并且已经可以在我的IDE中使用。我是否必须在我的DjangoObjectType中额外声明它们,或者在用户发送请求后创建一个自定义节点来操作和更改这些值?

EN

回答 1

Stack Overflow用户

发布于 2021-09-08 09:01:24

添加中间件可能允许在发出请求后和运行查询之前更改输入值。石墨烯有一个例子是:https://docs.graphene-python.org/en/latest/execution/middleware/

但是,(对我来说)从文档中不清楚提到的参数中有哪些将包含您想要操作的first字段。

然而,中间件方法似乎并没有被强烈推荐,因为这是一种不良的副作用:https://github.com/graphql-python/graphene/issues/1285

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60235116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档