#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