排序嵌套字段python - grapheneSQLAlchemy的结果列表



我有一个关于如何使用GraphQL对多对一关系中的结果列表进行排序的问题。让我们以graphene-sqlalchemy为例。

模式为:

class Department(Base):
__tablename__ = 'department'
id = Column(Integer, primary_key=True)
name = Column(String)

class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String)
hired_on = Column(DateTime, default=func.now())
department_id = Column(Integer, ForeignKey('department.id'))
department = relationship(
Department,
backref=backref('employees',
uselist=True,
cascade='delete,all'))

这是我的Schema:

import graphene
from models import (Employee as EmployeeModel, Department as DepartmentModel)
from graphene_sqlalchemy import (
SQLAlchemyObjectType
)

class Employee(SQLAlchemyObjectType):
class Meta:
model = EmployeeModel

class Department(SQLAlchemyObjectType):
class Meta:
model = DepartmentModek
class Query(graphene.ObjectType):
find_departments = graphene.List(of_type = Department)
def resolve_find_departments(root, info) : 
return db.session.query(DepartmentModel).all()

在我的查询中,我想访问我部门的员工列表,并按姓名排序结果。我的查询可以像这样:

query findDepartments(){
findDepartments{
department{
employee(orderBy : 'name'){
name
}
}

}
}

但是这个查询不能工作。如何实现对嵌套字段employee的排序?

有多种方法可以做到这一点,但最简单的方法是创建一个自定义解析器,其中包含您想要的顺序,例如

class Query(graphene.ObjectType):
find_departments = graphene.List(of_type = Department)
find_departments_by_name = graphene.List(of_type = Department)

def resolve_find_departments(root, info): 
return db.session.query(DepartmentModel).all()
def resolve_find_departments_by_name(root, info): 
return db.session.query(DepartmentModel).order_by("name").all()  # this is a guess of how sqlalchemy sorting syntax

您可以覆盖employees的解析器:

import graphene
from models import (Employee as EmployeeModel, Department as DepartmentModel)
from graphene_sqlalchemy import (
SQLAlchemyObjectType
)

class Employee(SQLAlchemyObjectType):
class Meta:
model = EmployeeModel

class Department(SQLAlchemyObjectType):
class Meta:
model = DepartmentModel

employees = graphene.List(of_type=Employee, order_by=graphene.String())
def resolve_employees(root, info, **kwargs):
query = self.employees
order_arg = kwargs.get('order_by')
if order_org:
# should check that `order_arg` is a column of `Employee`
query = query.order_by(order_arg)
return query.all()

class Query(graphene.ObjectType):
find_departments = graphene.List(of_type = Department)
def resolve_find_departments(root, info) : 
return db.session.query(DepartmentModel).all()