Graphql 如何根据python中动态给出的多个不同标记获取shopify产品?

Graphql 如何根据python中动态给出的多个不同标记获取shopify产品?,graphql,shopify,shopify-api,shopify-api-node,Graphql,Shopify,Shopify Api,Shopify Api Node,我试图通过基于标签的过滤从shopify获取产品。标记将是动态的,不止一个,并且会更改 import json import time import requests API_KEY = 'xxxx' PASSWORD = 'xxxx' SHOP_NAME = 'xxxx' API_VERSION = '2020-04' #change to the API version shop_url = "https://%s:%s@%s.myshopify.com/admin/api/%s

我试图通过基于标签的过滤从shopify获取产品。标记将是动态的,不止一个,并且会更改

import json
import time
import requests

API_KEY = 'xxxx'
PASSWORD = 'xxxx'
SHOP_NAME = 'xxxx'
API_VERSION = '2020-04' #change to the API version
shop_url = "https://%s:%s@%s.myshopify.com/admin/api/%s" % (API_KEY, PASSWORD, SHOP_NAME, API_VERSION)

def callShopifyGraphQL(GraphQLString, data):
    headers = {
        "X-Shopify-Storefront-Access-Token": 'xxxxxx',
        "accept":"application/json"      
    }
    response = requests.post(shop_url+'/graphql', json={'query': GraphQLString, 'variables': data}, headers=headers)
    answer = json.loads(response.text)
    return answer['data']

str1 = '0-12'
str2 = 'physical'

graphQLquery7 = """ {
  products(first:100, query:"tag:$tags") {
    edges {
      node {
        id
        tags
        title
        onlineStoreUrl
      }
    }
  }
}"""

tag = dict({
  "tags":[str1,str2]
})

resp = callShopifyGraphQL(graphQLquery7, tag)
print json.dumps(resp)


# This query works fine and gives multiple products
# graphQLquery2 = """{
#   products(first:100, query:"tag:[0-12, physical]") {
#     edges {
#       cursor
#       node {
#         id
#         tags
        
#         title
#         onlineStoreUrl
#       }
#     }
#   }
# }"""
我得到的输出基本上是一个产品为空的JSON

{u'extensions': {u'cost': {u'requestedQueryCost': 102, u'throttleStatus': {u'restoreRate': 50.0, u'currentlyAvailable': 998, u'maximumAvailable': 1000.0}, u'actualQueryCost': 2}}, u'data': {u'products': {u'edges': []}}}
{"products": {"edges": []}}
我无法在查询中将标记作为变量传递。我目前正在使用GraphQl,因为我找不到基于多个不同标签的RESTAPI获取产品


编辑:删除了Python标记,因为这不是Python的问题,我已经添加了答案,并演示了两种方法如何执行此操作

您必须使用流畅的语法:

{
  products(first:10, query:"tag:tag1 OR tag:tag2 OR tag:tag3"){
    edges {
      node {
        id
        tags
        title
        onlineStoreUrl
      }
    }
  }
}
如果希望包含所有标签或列出的任何标签,可以使用

在实现查询之前安装并测试查询,这对开发过程有很大帮助


有关GraphQL搜索查询的更多信息,请参见此处:

我终于找到了我自己问题的答案->

  • 第一种方法是一种变通方法(或廉价的python技巧),它可能只适用于问题中提到的场景。由于查询是作为字符串(多行字符串)传入的,我可以简单地使用占位符,通过滥用括号
    和逗号
    的行连续属性,在其中添加变量
  • 但是,这不是在GraphQl查询中使用变量的方式

  • 下面是在GraphQl中使用变量的更合适的解决方案

  • 我知道如何基于多个标记搜索产品。我将如何将它们作为变量/参数动态传递?我正在编写一个API,用于获取具有给定标记集的产品。标记可以更改并且是动态的。查看代码中注释的部分,如下所示:well@HARSHITBAJPAI我不是Python专家(我已经多年没有接触过它了)我假设它有字符串连接。我看不出将数组/字典转换为字符串并传递它有什么问题。如果Python字符串操作有一些限制,我不知道,请忽略我的回答。:)我只是删除了Python标记,因为这不是Python问题。我刚刚发布了这个问题的答案,说明了两种方法。如果您觉得它有用且合适,您可以将其标记为正确@drip——
    graphQLquery1 = """ {
      products(first:100, query:"tag:[%s, %s]") {
        edges {
          node {
            id
            tags
            title
            onlineStoreUrl
          }
        }
      }
    }"""%('3+', 'personal-social')
    
    data = None
    resp = callShopifyGraphQL(graphQLquery1, data)
    
    graphQLquery2 = """ query($tags: String){
    products(first:100, query:$tags) {
        edges {
          node {
            id
            tags
            title
            onlineStoreUrl
          }
        }
      }
    }"""
    
    str1 = '0-12'
    str2 = 'physical'
    tags = dict({
      "tags":[str1,str2]
    })
    resp = callShopifyGraphQL(graphQLquery2, tags)