Как бороться с django-graphene с первичными ключами UUID в django?

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

Не могли бы вы предоставить дополнительную информацию о том, как настраиваются ваша схема и модели? И что вы подразумеваете под «разобраться с этим должным образом»? Это у вас сейчас не работает?

jkimbo 20.05.2018 22:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
721
1

Ответы 1

Основываясь на том факте, что сериализация (запрос) идентификаторов довольно просто обрабатывается 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

Другие вопросы по теме