我正在学习如何使用GraphQL和python。我已经找到了graphene项目以及它的SQLAlchemy和Flask扩展。我一直在阅读教程和文档,但在确定模式时很难弄清class Meta
的用途。我目前正在关注this教程。我到处搜寻,似乎找不到任何东西。
这是教程中的一些代码。我对使我感到困惑的那条线发表了评论。
从graphene_sqlalchemy导入SQLAlchemyObjectType
从database.model_people导入ModelPeople
进口石墨烯
#创建一个通用类以使查询和变异的人员属性描述相互关联
类PeopleAttribute:
name = graphene.String(description =“人名。”)
身高= graphene.String(description =“人的身高。”)
mass = graphene.String(description =“人的质量。”)
hair_color = graphene.String(description =“人的头发颜色。”)
skin_color = graphene.String(description =“人的肤色。”)
eye_color = graphene.String(description =“人的眼睛颜色。”)
birth_year = graphene.String(description =“此人的出生年份。”)
性别= graphene.String(description =“人的性别。”)
planet_id = graphene.ID(description =“此人来自的星球的全球ID。”)
url = graphene.String(description =“星际大战API中人员的网址。”)
类People(SQLAlchemyObjectType,PeopleAttribute):
“”“人的节点。”“”
#----------这个课程是做什么用的?烧瓶+石墨烯+ sqlalchemy生态系统的哪一部分使用它?
类Meta:
型号= ModelPeople
接口=(graphene.relay.Node,)
最佳答案
我和你在同一条船上。对于您来说可能有点晚了,但是对于遇到这个问题的其他人来说,这就是我在学习GraphQL和Graphene时发现的。
我也对子类Meta
类感到困惑。这就是文档中指出的内容。
Graphene在ObjectType上使用Meta内部类来设置不同的选项。
https://docs.graphene-python.org/en/latest/types/objecttypes/#objecttype-configuration-meta-class
Meta类实质上允许您更改/修改类的属性。例如,可以通过设置name = <short name of class>
来更改查询特定类的方式的名称。
默认情况下,GraphQL模式中的类型名称将与定义ObjectType的类名称相同。可以通过在Meta类上设置name属性来更改它:
他们使用的示例是这个。
from graphene import ObjectType
class MyGraphQlSong(ObjectType):
class Meta:
name = 'Song'
因此,您不必通过“ Song”查询“ MyGraphQlSong”。
您还可以添加其他内容,例如Description和父类应该继承的接口(所有内容均在上面的链接中进行了描述)。
您可以更改/修改的属性的完整列表在API参考中(特定于ObjectType。其他类型具有其他元类选项。在此进行详细说明。https://docs.graphene-python.org/en/latest/api/
Meta class options (optional):
name (str): Name of the GraphQL type (must be unique in schema). Defaults to class
name.
description (str): Description of the GraphQL type in the schema. Defaults to class
docstring.
interfaces (Iterable[graphene.Interface]): GraphQL interfaces to extend with this object.
all fields from interface will be included in this object’s schema.
possible_types (Iterable[class]): Used to test parent value object via isintance to see if
this type can be used to resolve an ambigous type (interface, union).
default_resolver (any Callable resolver): Override the default resolver for this
type. Defaults to graphene default resolver which returns an attribute or dictionary key with the same name as the field.
fields (Dict[str, graphene.Field]): Dictionary of field name to Field. Not recommended to
use (prefer class attributes).
我在查找SQLAlchemy示例中的“模型= ...”的来源时遇到了问题。我找不到任何参考“模型”含义的文档,但我的猜测是,由于
SQLAlchemyObjectType
是ObjectType
的子类,因此SQLAlchemyObjectType
添加了一些自己的“选项”,但这些文档并未真正记录(到目前为止)据我所知)。我仔细阅读了源代码,并确定找到了对“ model = ...”的引用。https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/types.py#L174
SQLAlchemyObjectType
类添加了三个选项,即模型,注册表和连接。如果查看代码,则model
选项是您的SQLAlchemy模型类。 SQLAlchemyObjectType
类使用模型选项来检查模型并自动创建各自的字段。希望这可以节省其他人的时间,而不必进行查找。
关于python - Graphite 烯中的meta子类是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50300832/