【问题标题】:Sort list of results in nested field graphql - python - grapheneSQLAlchemy对嵌套字段graphql中的结果列表进行排序 - python - grapheneSQLAlchemy
【发布时间】:2022-06-27 04:02:47
【问题描述】:

我有一个关于如何使用 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'))

这是我的架构:

    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
                }
            }
    
        }
    }

但是这个查询不起作用。如何实现嵌套字段员工的排序?

【问题讨论】:

    标签: sqlalchemy graphql graphene-python


    【解决方案1】:

    有多种方法可以做到这一点,但一种简单的方法是创建一个具有您想要的排序的自定义解析器,即类似

    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
    

    【讨论】:

    • 这里的问题是我想按名称而不是部门来排序员工。 Employee 是 DepartmentModel 中的一个嵌套字段。
    • 明白了。此答案不适用于您的需要。 @jorzel 的答案似乎在正确的轨道上(尽管它需要缩进修复。)
    【解决方案2】:

    您可以覆盖 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()
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2013-02-06
      • 2018-10-20
      相关资源
      最近更新 更多