Могу ли я вложить похожие отношения модели в пользовательский тип в Graphene Django?

#django #graphql #graphene-python #graphene-django

#django #graphql #graphene-python #graphene-django

Вопрос:

Предполагая, что у меня есть модель Django с несколькими взаимосвязанными отношениями, возможно ли вложить их через немодельный тип для целей запросов? Конкретный пример:

Предположим, у меня есть модель Organization с отношениями, которые включают X_projects , X_accounts , и т.д., Которые также являются моделями Django.

Довольно легко разрешить такие запросы, как:

 query fetchOrganization($id: Int!) {
  organization(id: $id) {
    id,
    ... other fields ...
    X_accounts {
      ...
    }
    X_projects {
      ...
    }
  }
}
  

но я бы предпочел поддерживать такие запросы, как:

 query fetchOrganization($id: Int!) {
  organization(id: $id) {
    id,
    ... other fields ...
    X {
      accounts {
        ...
      }
      projects {
        ...
      }
    }
  }
}
  

Учитывая, что X на самом деле не имеет смысла использовать модель / отношение Django в серверной части, есть ли способ добиться этого?

Комментарии:

1.docs.graphene-python.org/projects/django/en/latest/queries/… ?

Ответ №1:

Да, вы можете сделать это, изменив новый распознаватель для «X», который использует пользовательский тип объекта, содержащий поля для учетных записей и проектов.

Вам нужно будет создать новый составной тип объекта, который является контейнером, например, для учетных записей и проектов (при условии, что вы также DjangoObjectType уже определили класс для моделей вашей учетной записи и проекта)

 class XType(graphene.ObjectType):
    account = graphene.Field(AccountType)
    project = graphene.Field(ProjectType)
  

Затем измените определение типа вашей организации, чтобы добавить новое поле, что-то вроде

 class OrganizationType(DjangoObjectType):
   x = graphene.Field(XType)

   class Meta:
        model = Organization
        # You might want to exclude the x_project and x_account fields

   def resolve_x(self, info, **kwargs):
       # You'll have to work out how to parse arguments and fetch account and project
       return XType(account=account, project=project)
  

Комментарии:

1. Спасибо, очень полезно!