Вопрос:

Что такое мета подкласс в графене?

python flask sqlalchemy graphene-python flask-graphql

180 просмотра

1 ответ

2011 Репутация автора

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

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

из graphene_sqlalchemy import SQLAlchemyObjectType
из database.model_people импортировать ModelPeople
импортный графен


# Создайте универсальный класс для согласования описания атрибутов людей как для запросов, так и для мутаций.
Класс PeopleAttribute:
    name = graphene.String (description = "Имя человека.")
    height = 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 = "Год рождения человека.")
    пол = графен.Строка (описание = "Пол человека.")
    planet_id = graphene.ID (description = "Глобальный идентификатор планеты, из которой происходит человек".)
    url = graphene.String (description = "URL человека в API Звездных войн.")


Класс People (SQLAlchemyObjectType, PeopleAttribute):
    "" "Узел людей." ""

    # ---------- Для чего этот класс используется? Какая часть колбы + графена + sqlalchemy экосистема использует это?
    Класс Meta:
        model = ModelPeople
        interfaces = (graphene.relay.Node,)
Автор: Paymahn Moghadasian Источник Размещён: 11.05.2018 10:02

Ответы (1)


0 плюса

650 Репутация автора

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

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

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

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

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

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

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

from graphene import ObjectType

class MyGraphQlSong(ObjectType):
    class Meta:
        name = 'Song'

Поэтому вместо того, чтобы запрашивать «MyGraphQlSong», вы можете запросить его через «Песню».

Вы также можете добавить другие вещи, такие как Description, и интерфейсы, от которых должен наследоваться ваш родительский класс (все описано в ссылке выше).

Полный список атрибутов, которые вы можете изменить / изменить, приведен в справочнике по API (это относится к ObjectType. Другие типы имеют другие параметры мета-класса. Это объясняется более подробно здесь. Https://docs.graphene-python.org / о / последняя / 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добавил несколько своих «опций», которые на самом деле не документированы (насколько я могу судить). Я пошел и прочитал исходный код и, конечно же, нашел эту ссылку на "модель = ..."

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

Он ссылается на опцию «модель», которая, как я предполагаю, использует опцию «модель» в Metaклассе, чтобы указать на основную модель SQLAlchemy.

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

Автор: Kevin Vasko Размещён: 12.06.2019 09:27
Вопросы из категории :
32x32