Мы используем Django и django-graphene для предоставления GraphQL API. У нас есть первичные ключи UUID в моделях. Как правильно с этим бороться?






Основываясь на том факте, что сериализация (запрос) идентификаторов довольно просто обрабатывается DjangoObjectType, я предполагаю, что ваш вопрос касается мутаций.
Кроме того, поскольку хорошая практика скорее ориентирована на создание идентификаторов на стороне сервера, я также проигнорирую тот факт, что вы упомянули UUID: я чувствую, что эта логика должна обрабатываться за пределами уровня graphql.
Таким образом, нам кажется, что остался вопрос:
Is there a graphene-django Input field to validate primary keys used as mutation arguments ?
Не удалось найти по этому поводу никаких документов, поэтому я рискнул сделать следующее:
def PrimaryKey(model: django.db.models.Model):
""" This contrived way of creating PrimaryKey classes is due to the fact that
parse_literal is a static method of graphene.Scalar.
"""
def parse_literal(node):
if isinstance(node, ast.IntValue):
pk = node.value
elif isinstance(node, ast.StringValue):
pk = int(node.value)
else:
raise GraphQLError(f'Unsupported type for PrimaryKey: {type(node)}')
return model.objects.get(pk=pk)
return type(
f'{model.__name__}PrimaryKey',
(graphene.Scalar,),
dict(
parse_literal=parse_literal,
serialize=lambda x: None,
parse_value=lambda x: None,
)
)
Предложение по использованию (показаны не все модели):
class CreateProject(graphene.Mutation):
class Arguments:
name = graphene.String()
owner = PrimaryKey(User) # graphene.List(PrimaryKey(User)) works too
ok = graphene.Boolean()
@staticmethod
def mutate(root, info, name: str, owner: User): # owner has been instantiated
pass # do business
Не могли бы вы предоставить дополнительную информацию о том, как настраиваются ваша схема и модели? И что вы подразумеваете под «разобраться с этим должным образом»? Это у вас сейчас не работает?