【问题标题】:Django query resolver for a specific field (graphql)特定字段的 Django 查询解析器 (graphql)
【发布时间】:2022-01-20 02:53:20
【问题描述】:

我想做一个只显示 variant_view_configuration 字段的查询。我该如何解决这个问题?如果我这样写(返回 User.objects.get(pk=instance.id).variant_view_configuration),它会给我一个错误 - 但我只需要 variant_view_configuration

class User(AbstractUser):
    variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)

class UserQueries(object):
    user_variant_view_preference = graphene.Field(UserNode, id=graphene.ID(required=True))

    def resolve_user_variant_view_preference(self, info, id):
        instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
        if not instance:
            raise ApplicationError.general.not_found(id)

        return User.objects.get(pk=instance.id).variant_view_configuration

GraphQL 查询:

QUERY = """
    query Test($id: ID!) {
        userVariantViewPreference(id: $id) {
            variantViewConfiguration
        }
    }
"""


def test_user_variant_preference(graphql_request_maker):
    user = User.objects.create(
        username='username12',
        email='btestare@example.com',
        variant_view_configuration=["colors[0].sizes[0].size", "details.country_of_origin"]
    )

    data, err = graphql_request_maker.make(
        QUERY,
        {
            "id": to_global_id('UserNode', user.id)
        }
    )

所以,正如我所说,我想要一个仅返回特定用户 ID 的 variant_view_configuration 的查询。

我是 django 和 graphql 的新手,请解释一下我是如何做到的。 谢谢!

【问题讨论】:

  • 如果问题是您不想显示用户模型的其他字段,您可以简单地使用return User.objects.filter(pk=instance.id).only('variant_view_configuration')
  • 问题不是查询集,是你的user_variant_view_preference = graphene.Field 你必须使用user_variant_view_preference = graphene.List 因为你要返回一个对象列表
  • 错误信息是什么意思?

标签: django django-models graphql graphene-python graphene-django


【解决方案1】:

我会建议你通过 instance.id 过滤而不是获取实例 id。所以一个好的做法是:

class User(AbstractUser):
    variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)

class UserQueries(object):
    user_variant_view_preference = graphene.Field(UserNode, id=graphene.ID(required=True))

    def resolve_user_variant_view_preference(self, info, id):
        instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
        if not instance:
            raise ApplicationError.general.not_found(id)

        return User.objects.filter(pk=instance.id).only('variant_view_configuration')

【讨论】:

    【解决方案2】:

    您应该将解析器类型从 UserNode 更改为 graphene.List(graphene.String)

    class User(AbstractUser):
        variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)
    
    class UserQueries(object):
        user_variant_view_preference = graphene.List(graphene.String, id=graphene.ID(required=True))
    
        def resolve_user_variant_view_preference(self, info, id):
            instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
            if not instance:
                raise ApplicationError.general.not_found(id)
    
            return User.objects.get(pk=instance.id).variant_view_configuration
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2019-09-22
      • 2019-10-03
      • 2020-10-07
      • 2019-08-16
      • 2020-07-08
      • 2017-01-15
      • 2021-07-26
      • 2020-08-26
      相关资源
      最近更新 更多