Ich versuche, ObjectType Felder mit InlineFragment auf einem ObjectType aufzulösen, die von einer Schnittstelle erben, aber es scheint nicht zu funktionieren.Python Graphene Interface + InlineFragment scheint nicht ObjectType Felder auflösen
Hier ist mein Schema:
@schema.register
class BundleInterface(graphene.Interface):
id = graphene.ID()
identifier = graphene.String()
name = graphene.String()
publication_date = DateTime()
articles = graphene.List('Article')
def resolve_articles(self, args, info):
info_parser = InfoParser('Article', info)
return self.articles.options(load_only(*info_parser.root_fields)).all()
@classmethod
def _resolve_type(cls, schema, instance, *args):
if instance.mid is not None:
return Issue.internal_type(schema)
return Bundle.internal_type(schema)
@schema.register
class Bundle(BundleInterface):
pass
@schema.register
class Issue(BundleInterface):
mid = graphene.String()
cover = graphene.Field('Image')
pages = graphene.List('Page')
def resolve_cover(self, args, info):
pass
def resolve_pages(self, args, info):
return self.pages['pages']
Hier meine Frage ist:
class Query(graphene.ObjectType):
bundle = graphene.Field('BundleInterface', identifier=graphene.String())
def resolve_bundle(self, args, info):
info_parser = InfoParser('BundleInterface', info)
filters = {}
filters[object_type_to_model['BundleInterface']['fields']['identifier']] = args.get('identifier')
return info_parser.root_model.query.filter_by(**filters)\
.options(load_only(*info_parser.root_fields))\
.one()
Hier ist mein sqlalchemy Modell:
class Bundle(Base):
__tablename__ = 'bundle'
bundle_id = Column(Integer, primary_key=True)
identifier = Column(UUID(as_uuid=True))
name = Column(String)
publication_date = Column(DateTime)
mid = Column(UUID(as_uuid=True))
pages = Column(JSONB)
source_id = Column(Integer, ForeignKey('source.source_id'))
Hier ist meine Abfrage in graphiql:
{
bundle(identifier: "30752cba-f3a7-49c8-b6c7-afa6a9579a1c") {
name
... on Issue {
mid
}
}
}
Und hier ist mein Ergebnis:
{
"data": {
"bundle": {
"name": "bundle 1"
}
}
}
Ich bin sicher, dass _resolve_type Methode der BundleInterface eine Ausgabe zurückgeben Objecttype (weil ich es gedruckt haben), aber nach, dass ich weiß nicht, warum Ausgabe Objecttype nicht behoben ist.
Ich weiß auch, dass Daten von postgresql mit sqlalchemy abgerufen enthält Daten, die Issue ObjectType muss sich selbst auflösen, weil ich sehe in Flaschen logs die sql Anfrage an psotgresql gesendet. Hier
ist die SQL-Anfrage:
[2016-06-16 20:03:14,588: INFO/sqlalchemy.engine.base.Engine] BEGIN (implicit)
[2016-06-16 20:03:14,589: INFO/sqlalchemy.engine.base.Engine] SELECT bundle.bundle_id AS bundle_bundle_id, bundle.name AS bundle_name, bundle.mid AS bundle_mid
FROM bundle
WHERE bundle.identifier = %(identifier_1)s
[2016-06-16 20:03:14,589: INFO/sqlalchemy.engine.base.Engine] {'identifier_1': '30752cba-f3a7-49c8-b6c7-afa6a9579a1c'}
können wir sehen, dass Daten abgerufen Mitte Ausprägungs die von potsgresql so Daten zur Verfügung stehen für die Ausgabe Objecttype selbst zu lösen.
Aber sqlalchemy gibt eine Liste der Bundle-Instanz zurück und ich möchte einen Issue ObjectType auflösen, vielleicht funktioniert es nicht Ursache dafür, aber ich bin nicht sicher, weil Bundle ObjectType sich mit Bundle sqlalchemy-Instanz löst.
Plus keine Fehler werden in graphiql Schnittstelle angezeigt.
Ich weiß nicht, ob es der richtige Weg ist, dieses Muster zu implementieren?
Haben Sie eine Idee, um mein Problem zu lösen?