簡體   English   中英

在 Graphene 中,如何同時提供一個列表和一個特定元素?

[英]In Graphene, how do you provide both a list and a specific element from one?

現在,我有一些代碼可以讓我獲取所有項目及其屬性:

import graphene

class Item(graphene.ObjectType):
    name = graphene.String()
    item_id = graphene.String()

class Query(graphene.ObjectType):
    items = graphene.List(Item)

    def resolve_items(self, info):
        return [
            Item(name="Enchanted Diamond", item_id="ENCHANTED_DIAMOND"),
            Item(name="Enchanted Diamond Block", item_id="ENCHANTED_DIAMOND_BLOCK"),
            Item(name="Power Crystal", item_id="POWER_CRYSTAL"),
            Item(name="Bejeweled Handle", item_id="BEJEWELED_HANDLE"),
        ]


schema = graphene.Schema(query=Query)

但是,我也希望能夠獲得特定的項目。 現在,如果我運行查詢

{
items(name: "Enchanted Diamond") {
name
}
}

我得到一個

GraphQLError("Unknown argument 'name' on field 'Query.items'.", locations=[SourceLocation(line=3, column=7)])

我將如何提供一種獲取特定元素的方法,理想情況下不提供完整的單獨端點?

我在聲明items時必須指定參數。 這是我更改的代碼部分:

    items = graphene.List(Item, name=graphene.String(), item_id=graphene.String())

    def resolve_items(self, info, name=None, item_id=None):
        available_items = [
            Item(name="Enchanted Diamond", item_id="ENCHANTED_DIAMOND"),
            Item(name="Enchanted Diamond Block", item_id="ENCHANTED_DIAMOND_BLOCK"),
            Item(name="Power Crystal", item_id="POWER_CRYSTAL"),
            Item(name="Bejeweled Handle", item_id="BEJEWELED_HANDLE"),
        ]
        if name:
            return [item for item in available_items if item.name == name]
        if item_id:
            return [item for item in available_items if item.item_id == item_id]
        return available_items

我覺得這比聲明一個完整的單獨item要好,即使我覺得應該有更好的編碼方式。 (調查我現在如何使用 Unions 來改進它)

暫無
暫無

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

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