Разрешитель запросов Django для определенного поля (graphql)
Я хочу сделать запрос, который отображает только поле variant_view_configuration. Как я могу решить эту проблему? Если я пишу так (return 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)
}
)
Итак, как я уже сказал, мне нужен запрос, который возвращает только и только вариант_просмотра_конфигурации для определенного идентификатора пользователя.
Я новичок в django и graphql, пожалуйста, объясните, как мне это сделать. Спасибо!
Я предлагаю фильтровать по 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')
Вам следует изменить тип резольвера с 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