当使用外部数据库从多个表中获取数据时(即创建一个Django模型来表示数据不对应于我的数据库中的单个表),最佳方法是如何使用GraphQL与Django一起使用?
我的方法是暂时放弃使用Django模型,因为我认为我还没有完全理解它们。(我对Django和GraphQL都是完全新手。)我设置了一个简单的项目,其中包含一个连接的外部Postgres DB的应用程序。我按照Graphene Django教程中的所有设置进行了设置,然后遇到了一个障碍,当我意识到我创建的模型是几个表的综合体时。
我有一个查询,将正确的列映射到我模型中的字段,但我不知道如何使这成为动态连接,这样当我的API被命中时,它会查询我的数据库并将行映射到我在Django中定义的模型架构。
自那以后,我的方法是避免使用模型,并使用Steven Luscher的演讲中演示的更简单的方法:30分钟内零到GraphQL。
返回:
在我的终端中,我从QueryType的resolve方法中打印并且可以看到数据成功地从我的Postgres连接返回。然而,GraphQL给了我null,所以必须是在resolve方法中出了问题导致了某些映射出错。
我该如何将我的数据正确映射到我在OrderItemType中定义的字段?
以下是一些更多的参考资料:
我的方法是暂时放弃使用Django模型,因为我认为我还没有完全理解它们。(我对Django和GraphQL都是完全新手。)我设置了一个简单的项目,其中包含一个连接的外部Postgres DB的应用程序。我按照Graphene Django教程中的所有设置进行了设置,然后遇到了一个障碍,当我意识到我创建的模型是几个表的综合体时。
我有一个查询,将正确的列映射到我模型中的字段,但我不知道如何使这成为动态连接,这样当我的API被命中时,它会查询我的数据库并将行映射到我在Django中定义的模型架构。
自那以后,我的方法是避免使用模型,并使用Steven Luscher的演讲中演示的更简单的方法:30分钟内零到GraphQL。
简而言之;
目标是能够访问我的GraphQL端点,使用来自django.db.connection的游标对象获取一个字典列表,这些字典应该解析为OrderItemTypes的GraphQLList(见下文)。
问题是当我使用查询命中以下端点时,每个值都返回null:
localhost:8000/api?query={orderItems{date,uuid,orderId}}
返回:
{ "data":{ "orderItems":[ {"date":null, "uuid":null, "orderId":null }, ... ] } }
project/main/app/schema.py
import graphene
from django.db import connection
class OrderItemType(graphene.ObjectType):
date = graphene.core.types.custom_scalars.DateTime()
order_id = graphene.ID()
uuid = graphene.String()
class QueryType(graphene.ObjectType):
name = 'Query'
order_items = graphene.List(OrderItemType)
def resolve_order_items(root, args, info):
data = get_order_items()
# data prints out properly in my terminal
print data
# data does not resolve properly
return data
def get_db_dicts(sql, args=None):
cursor = connection.cursor()
cursor.execute(sql, args)
columns = [col[0] for col in cursor.description]
data = [
dict(zip(columns, row))
for row in cursor.fetchall() ]
cursor.close()
return data
def get_order_items():
return get_db_dicts("""
SELECT j.created_dt AS date, j.order_id, j.uuid
FROM job AS j
LIMIT 3;
""")
在我的终端中,我从QueryType的resolve方法中打印并且可以看到数据成功地从我的Postgres连接返回。然而,GraphQL给了我null,所以必须是在resolve方法中出了问题导致了某些映射出错。
[ { 'uuid': u'7584aac3-ab39-4a56-9c78-e3bb1e02dfc1', 'order_id': 25624320, 'date': datetime.datetime(2016, 1, 30, 16, 39, 40, 573400, tzinfo=<UTC>) }, ... ]
我该如何将我的数据正确映射到我在OrderItemType中定义的字段?
以下是一些更多的参考资料:
project/main/schema.py
import graphene
from project.app.schema import QueryType AppQuery
class Query(AppQuery):
pass
schema = graphene.Schema(
query=Query, name='Pathfinder Schema'
)
文件树
|-- project
|-- manage.py
|-- main
|-- app
|-- models.py
|-- schema.py
|-- schema.py
|-- settings.py
|-- urls.py
RowType(*row)
之前应该展开行列表。一般来说,这是一个好的做法吗?还是有更好的获取外部数据的方法? - John William Domingopip install graphene-django>=1.0.dev
进行安装。 希望这能帮到您! - Syrus Akbary Nieto