Что такое мета подкласс в графене? - PullRequest
0 голосов
/ 12 мая 2018

Я учусь использовать GraphQL и python.Я нашел проект графен вместе с его расширениями SQLAlchemy и Flask.Я читал учебные пособия и документы, и мне трудно понять, для чего используется class Meta при определении схемы.Я сейчас следую этому учебнику.Я погуглил и, похоже, ничего не нашел.

Вот код из учебника.Я прокомментировал строку, которая меня смущает.

from graphene_sqlalchemy import SQLAlchemyObjectType
from database.model_people import ModelPeople
import graphene


# Create a generic class to mutualize description of people attributes for both queries and mutations
class PeopleAttribute:
    name = graphene.String(description="Name of the person.")
    height = graphene.String(description="Height of the person.")
    mass = graphene.String(description="Mass of the person.")
    hair_color = graphene.String(description="Hair color of the person.")
    skin_color = graphene.String(description="Skin color of the person.")
    eye_color = graphene.String(description="Eye color of the person.")
    birth_year = graphene.String(description="Birth year of the person.")
    gender = graphene.String(description="Gender of the person.")
    planet_id = graphene.ID(description="Global Id of the planet from which the person comes from.")
    url = graphene.String(description="URL of the person in the Star Wars API.")


class People(SQLAlchemyObjectType, PeopleAttribute):
    """People node."""

    # ---------- What's this class used for? Which part of the flask + graphene + sqlalchemy ecosystem uses it?
    class Meta:
        model = ModelPeople
        interfaces = (graphene.relay.Node,)

1 Ответ

0 голосов
/ 13 июня 2019

Я в той же лодке, что и вы.Возможно, немного поздно для вас, но для всех, кто сталкивался с тем же вопросом, это то, что я обнаружил, когда узнал о GraphQL и Graphene.

Я также был озадачен классом подкласса Meta.Это то, что говорится в документации.

Графен использует внутренний класс Meta в ObjectType для установки различных параметров.

https://docs.graphene -python.org / ru / latest / types / objecttypes /# objecttype-configuration-meta-class

Мета-класс, по сути, позволяет изменять / модифицировать атрибуты класса.Например, вы можете изменить имя запроса к этому конкретному классу, установив name = <short name of class>.

По умолчанию имя типа в схеме GraphQL будет таким же, как имя класса, которое определяетObjectType.Это можно изменить, установив свойство name в мета-классе:

Пример, который они используют, это ..

from graphene import ObjectType

class MyGraphQlSong(ObjectType):
    class Meta:
        name = '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).

У меня возникли проблемы с поиском источника "model = ..." в примерах SQLAlchemy. Я не смог найти никакой документацииссылаясь на то, что означало «модель», но я предположил, что, поскольку SQLAlchemyObjectType является подклассом ObjectType, SQLAlchemyObjectType добавил несколько своих собственных «опций», которые на самом деле не документированы (насколько я могу судить).Я пошел и прочитал исходный код и, конечно же, нашел эту ссылку на «модель = ...»

https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/types.py#L174

Класс SQLAlchemyObjectType добавляет еще три параметра, модель,реестр и соединение. Если вы просматриваете код, то опция model является вашим классом модели SQLAlchemy. Класс SQLAlchemyObjectType использует параметр модели для проверки вашей модели и автоматического создания соответствующих полей.

Надеюсь, этосохраняет сВремя других людей от необходимости искать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...