当前位置: 首页 > 知识库问答 >
问题:

graphene django:查询所有模型字段,而不是请求的字段

皮嘉德
2023-03-14

我有两种型号:

class Type(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return f'{self.name}'


class Pet(models.Model):
    name = models.CharField(max_length=255)
    color = models.CharField(max_length=255)
    type = models.ForeignKey(Type, related_name="pets", on_delete=models.CASCADE,
                             null=True, blank=True)

    def __str__(self):
        return f'{self.type.name} {self.name}'

模式:

class Type(DjangoObjectType):
    class Meta:
        model = TypeModel

    @classmethod
    def get_node(cls, info, id):
        return TypeModel.objects.get(id=id)


class TypeConnector(graphene.Connection):
    count = graphene.Int()

    class Meta:
        node = Type

    def resolve_count(root, info):
        return len(root.edges)


class Pet(DjangoObjectType):
    class Meta:
        model = PetModel
        interfaces = (relay.Node,)

    @classmethod
    def get_node(cls, info, id):
        return PetModel.objects.get(id=id)


class PetConnector(graphene.Connection):
    count = graphene.Int()

    class Meta:
        node = Pet

    def resolve_count(root, info):
        return len(root.edges)


class Schema(ObjectType):
    pets = graphene.ConnectionField(PetConnector)
    types = graphene.ConnectionField(TypeConnector)

    def resolve_pets(self, info, **kwargs):
        # TODO: Query for requested fields only
        return PetModel.objects.all()

    def resolve_types(self, info, **kwargs):
        # TODO: Query for requested fields only
        return TypeModel.objects.all()

GraphQL的目标之一是性能。为此,GraphQL必须通过GraphQL请求(例如:GraphiQL)仅向数据库请求所请求的字段

如果我请求以下查询:

{
  pets {
    edges {
      node {
        color
        type {
          name
        }
      }
    }
  }
}

石墨烯-django库生成以下SQL:

2020-01-03 03:16:18.184 UTC [136] LOG:  statement: SELECT "pets_pet"."id", "pets_pet"."name", "pets_pet"."color", "pets_pet"."type_id" FROM "pets_pet"
2020-01-03 03:16:18.189 UTC [136] LOG:  statement: SELECT "pets_type"."id", "pets_type"."name" FROM "pets_type" WHERE "pets_type"."id" = 1 LIMIT 21

它得到了模型的所有字段!与API Rest问题相同,不符合GraphQL指南。

如果我从pets模型中请求字段color,我希望查询是:

SELECT "pets_pet"."color" FROM "pets_pet"

外键如何解决这个问题?

共有1个答案

况景龙
2023-03-14

您可以尝试使用graphene django优化器。

它所做的是优化查询,以便在一个查询中获取所有相关对象。

在您的情况下,这可能是您的解析器:

import graphene_django_optimizer as gql_optimizer

...

class Schema(ObjectType):
    pets = graphene.ConnectionField(PetConnector)
    types = graphene.ConnectionField(TypeConnector)

    def resolve_pets(self, info, **kwargs):
        return gql_optimizer.query(PetModel.objects.all(), info)

它将自动生成以下查询集:

  Pets.objects
    .select_related('type')
    .only('color', 'type__name')
 类似资料:
  • 我用spring boot starter创建了一个基本的graphql java应用程序,并在使用Hibernate和Jpa的MSSQL数据库上使用graphql spqr库。 我有一个名为“任务”的实体,有5个字段。我有一个简单的Jpa存储库和一个调用“findAllTasks”方法的简单Jpa服务。它工作得很好,但是如果我指定(例如)使用graphiql只查询一个字段,我可以通过SQL日志看

  • 我使用的是ES版本5.6。我有一个像下面这样的文档存储在ES中。 我想搜索所有已“启用”的字段。 我尝试了以下查询,但都不起作用。 但是下面的查询起作用了 因此,看起来只匹配顶级字段,而不匹配嵌套字段。是否有任何方法可以查询包含在所有字段中的文本,包括嵌套字段。我不想显式指定嵌套字段名。我正在寻找一种全局搜索,我想在文档中的任何地方搜索“文本”。 谢了。

  • 我有一个控制器,它有这样一个查询: 一篇文章有许多评论,而一篇评论属于一篇文章。comments模型有一个id、comment、tag字段。 我想做的是,对于像这样的任何查询,模型都会返回字段id、注释、标记和tag_translated,后者只是使用朗外观对标记的翻译。 我可以通过在控制器上使用for来解决这个问题,它迭代$注释并添加字段,但是我必须为每个需要tag_translared字段的控

  • 问题内容: 我正在使用ColdFusion 8和SQL Server 2008 R2。 我试图查询一列值以获取具有范围内的值的行。该列应为数字,但不是。它被设置为varchar(由其他人)。有100,000多行数据。这是数据的伪样本: 我的查询如下所示: 该查询不会运行,因为where语句的列是varchar,并且出现转换错误,因此我必须将where语句更改为此: 现在,当我运行这样的查询时,它会

  • 我想通过枚举一组给定类的私有字段来动态创建一个类组合映射。这适用于具有一组独立类的getDeclaredFields()。 但是,如果类包含一个字段,该字段的类型是不可用的类,则调用将失败。有没有办法枚举私有字段,这样我就可以避免这种行为,例如一个接一个地捕捉异常并继续处理其余字段?