Как бороться с django-графеном с помощью первичных ключей UUID в django? - PullRequest
0 голосов
/ 18 мая 2018

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

1 Ответ

0 голосов
/ 24 сентября 2018

Исходя из того факта, что сериализация идентификаторов (запрос) обрабатывается довольно просто DjangoObjectType, я предполагаю, что ваш вопрос относится к мутациям.

Кроме того, поскольку хорошая практика скорее ориентирована на создание идентификаторов на сервереКроме того, я также буду игнорировать тот факт, что вы упомянули UUID: у меня такое чувство, что эту логику следует обрабатывать за пределами слоя graphql.

Поэтому вопрос, с которым мы, похоже, остались:

Есть ли поле ввода graphene-django для проверки первичных ключей, используемых в качестве аргументов мутации?

Не удалось найти ни одного документа по этому вопросу, поэтому я рискнул со следующим:

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
...