Как сделать несколько фильтров запросов в графеновой колбе?

Я относительный новичок в GraphQL, я пытаюсь сделать такой запрос

{
   user(username: "Jon") { 
     name
     last_lame
     username
     posts(in_draft : true) { 
       title
       text
       in_draft
       update_at      
     }
   }
}

Я хочу отфильтровать список сообщений, которые у пользователя есть в черновике

Единственный способ сделать запрос - это связать модели, но без возможности фильтрации сообщений в черновике. Один ко многим

class User(Base):
  __tablename__ = 'user'
  id = Column(Integer, primary_key=True)
  name = Column(String)
  last_lame = Column(String)
  username = Column(String)


class Post(Base):
  __tablename__ = 'post'
  id = Column(Integer, primary_key=True)
  title = Column(String)
  text = Column(String)
  in_draft = Column(Boolean) 
  post_id = Column(Integer, ForeignKey('user.id'))

  posts = relationship("User", backref='posts')

В этой связи я показываю узел сообщений с помощью "backref = 'posts'"

Мои объекты:

class User(SQLAlchemyObjectType):
  """User Object."""
  class Meta:
    model = UserModel
    interfaces = (relay.Node, )


class Post(SQLAlchemyObjectType):
  """Post Object."""
   class Meta:
      model = PostModel
      # interfaces = (relay.Node, )

Запрос:

class Query(graphene.ObjectType):

    user = graphene.Field(lambda: User, username=graphene.String())
    def resolve_user(self, info, username):
       query = User.get_query(info)
       return query.filter(UserModel.username == username).first()

Я хочу, чтобы запрос сообщений принадлежал пользователю

   posts = graphene.List(lambda: Post, in_draft=graphene.Boolean())
   def resolve_posts(self, info, in_draft):
      query = Post.get_query(info)
      return query.filter(PostModel.in_draft == in_draft).all()

schema = graphene.Schema(
   query=Query,
   types=[User, Post])

Есть идея или предложение?


person Alex    schedule 29.01.2018    source источник


Ответы (1)


Честно говоря, учитывая, что связь между User и Post уже определена, я бы создал один преобразователь, чтобы получить эти объединенные результаты, передавая два аргумента одновременно, например:

class Query(graphene.ObjectType):
    filter_user_posts = graphene.List(
        lambda: User,
        username=graphene.String,
        in_draft=graphene.Boolean,
    )
    def resolve_filter_user_posts(
        self, info, username, in_draft
    ):
        query = User.get_query(info=info)
        query = query.join(User.posts)
        query = query.filter(User.username == username)
        query = query.filter(Post.in_draft == in_draft)

        objs = query.all()

        return objs

который вы затем можете просто запросить следующим образом:

{
 filterUserPosts(username: "Jon", in_draft: true) { 
   name
   last_lame
   username
   posts{ 
     title
     text
     in_draft
     update_at      
   }
 }
}
person somada141    schedule 14.04.2018
comment
Мне подходит, кроме одной небольшой поправки или уточнения. в filter_user_posts. строка должна быть username = graphene.String (). Строка - это класс - person Saad Abdullah; 23.07.2020