Как получить схему моделей (type_defs) в виде строки?

#graphene-python

Вопрос:

Пример Кода

У меня есть следующая модель.

 class Post(Base):
    __tablename__ = "post"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)
    author = Column(String)
    content = Column(String)
    time_created = Column(DateTime(timezone=True), server_default=func.now())
 

с помощью этой схемы

 class PostSchema(SQLAlchemyObjectType):
    class Meta:
        model = Post
 

Проблема

Как получить определение схемы graphql в виде строки, подобной этой

 """
type Post{
id: ID
title: string!
author: String!
content: String!
time_created: Int!
}
"""
 
  • Я пробовал это, но type_defs выбора нет.
  • graphene.Field(PostModel).type_defs

Ответ №1:

Один из вариантов, который вы можете использовать, — это самоанализ вашей схемы, а не только типа объекта. Предположим, у вас есть графеновая схема, называемая schema ,

 from graphene_sqlalchemy import SQLAlchemyObjectType
class schema(SQLAlchemyObjectType):
    class Meta:
        model = MyModel
 

вы можете сделать что-то вроде:

 schema_dict = schema.introspect()
 

Это вернет диктованную версию вашей схемы, а типы, которые вы хотите, можно найти здесь:

 types = schema_dict["__schema"]["types"]
 

К сожалению, это возвращает список всех типов объектов, поэтому вам, возможно, потребуется обработать его, чтобы сузить то, что вы хотите, с помощью чего-то вроде:

 list(filter(lambda types: types['name'] == 'PostSchema', types))
 

альтернативный способ

 def make_schemas(model):
    d = """
        """
    for i, key in model.__table__.columns.items():

        x = str(key.type.python_type)
        x = x.replace("<class '", '')
        x = x.replace("'>", '')
        x = x.title()
        if x in ['Str', 'Datetime.Datetime']:
            x = 'String'
        if x == 'Bool':
            x = 'Boolean'
        d  = f"""
                {i}: {x}
                """
    y = f"""
    type {model.__tablename__.title()} {{
    {d}
    }}
    """
    return y