簡體   English   中英

如何將字段列表動態添加到 GraphQL ObjectType

[英]How can I add a list of fields dynamically to GraphQL ObjectType

我有以下代碼:

from starlette_graphene3 import GraphQLApp
import graphene

app = = APIRouter(
    dependencies=[Depends(auth_middleware)],
)

DYNAMIC_TYPES = {
    "length": graphene.Int(),
    "authors": graphene.List(of_type=str),
    "deprecated": graphene.String()
}

class MetaDataObject(graphene.ObjectType):
    resource_type = graphene.String()
    resource_name = graphene.String()

# I need to be able to do this somehow - specify a list of fieds and types dynamically.
for attr, g_type in DYNAMIC_TYPES.items():
    setattr(MetaDataObject, attr, g_type)


class Query(graphene.ObjectType):
    get_metadata = graphene.Field(MetaDataObject, resource_type=graphene.String(), resource_name=graphene.String())

    def resolve_get_metadata(self, info, resource_type, resource_name):

        response = table.get_item(
            Key={
                'resource_type': resource_type,
                'resource_name': resource_name
            }
        )

        if 'Item' not in response:
            return None

        return response['Item']


schema = graphene.Schema(query=Query, auto_camelcase=False)
app.add_route("/graphql", GraphQLApp(schema=schema))

如上所述,我需要能夠動態指定字段和類型列表並將其附加到元數據 Object。問題是graphe.ObjectType不是常規的 Python class,它有一個特殊的元類來處理一些幕后工作,但我不確定如何使用元類。

您可以在 MetaDataObject class 中創建一個 graphene.Dynamic 字段,它可以接受字段和類型列表作為參數。

您可以使用graphene.Field來定義字段,使用graphene.Listgraphene.NonNull來定義字段的類型。

喜歡;

class MetaDataObject(graphene.ObjectType):
    resource_type = graphene.String()
    resource_name = graphene.String()
    dynamic_fields = graphene.List(graphene.Field(graphene.String))

然后,您可以在創建元數據對象 class 的實例時將字段和類型列表傳遞給它。

喜歡;

metadata_object = MetaDataObject(dynamic_fields=[graphene.Field(graphene.String, name='field_name')])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM