Доступ к идентификатору базы данных в Graphene / Graphql

У меня есть следующий запрос, который фильтрует магазин с указанным идентификатором (с использованием sqlalchemy):

{
  shop(id: "mydevappstore") {
    id
  }
}

Результат будет следующим. Я ожидал, что идентификатор будет таким же, как указано выше:

{
  "data": {
    "shop": {
      "id": "U2hvcDpteWRldmFwcHN0b3Jl"
    }
  }
}

Я не понимаю, почему это происходит (также в учебнике Graphene) и как это исправить.

sqlalchemy_and_graphene.py - это

Base = declarative_base()

class ShopModel(Base):
    __tablename__ = 'shop'
    id = Column(String(128), primary_key=True)

class Shop(SQLAlchemyObjectType):
    class Meta:
        model = ShopModel
        interfaces = (relay.Node, )

person sonium    schedule 25.09.2020    source источник
comment
Как выглядит ваша таблица базы данных? также добавьте соответствующие части вашего кода   -  person JPG    schedule 25.09.2020
comment
Спасибо за отзыв. Надеюсь, теперь я сделал это более понятным   -  person sonium    schedule 26.09.2020


Ответы (1)


Вам необходимо явно указать поле id с помощью аргумента source

import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType


class Shop(SQLAlchemyObjectType):
    any_name = graphene.String(source='id')

    class Meta:
        model = ShopModel
        interfaces = (relay.Node,)
person JPG    schedule 26.09.2020
comment
Таким образом, поле идентификатора базы данных может быть доступно для anyName. Можно ли выставить как ID? К сожалению, id = graphene.String (source = 'id') приводит к AssertionError: Node.id ожидает ID типа! но Shop.id предоставляет тип String. - person sonium; 26.09.2020
comment
Не могли бы вы изменить graphene.Int(...)? - person JPG; 26.09.2020
comment
Нет, не работает. Проблема, похоже, связана с интерфейсом relay.Node. Работает подкласс релейного узла, как здесь: stackoverflow.com/questions/46490229/retrieve-the- - person sonium; 28.09.2020
comment
Да, я тоже это видел. Но мое решение будет работать для Django. Я в этом уверен. - person JPG; 28.09.2020