mirror of
https://github.com/graphql-python/graphene.git
synced 2024-09-22 20:09:02 +03:00
50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
|
from sqlalchemy.ext.declarative.api import DeclarativeMeta
|
||
|
from sqlalchemy.orm.query import Query
|
||
|
|
||
|
from graphene.utils import LazyList
|
||
|
|
||
|
|
||
|
def get_type_for_model(schema, model):
|
||
|
schema = schema
|
||
|
types = schema.types.values()
|
||
|
for _type in types:
|
||
|
type_model = hasattr(_type, '_meta') and getattr(
|
||
|
_type._meta, 'model', None)
|
||
|
if model == type_model:
|
||
|
return _type
|
||
|
|
||
|
|
||
|
def get_session(info):
|
||
|
schema = info.schema.graphene_schema
|
||
|
return schema.options.get('session')
|
||
|
|
||
|
|
||
|
def get_query(model, info):
|
||
|
query = getattr(model, 'query', None)
|
||
|
if not query:
|
||
|
session = get_session(info)
|
||
|
if not session:
|
||
|
raise Exception('A query in the model Base or a session in the schema is required for querying.\n'
|
||
|
'Read more http://graphene-python.org/docs/sqlalchemy/tips/#querying')
|
||
|
query = session.query(model)
|
||
|
return query
|
||
|
|
||
|
|
||
|
class WrappedQuery(LazyList):
|
||
|
|
||
|
def __len__(self):
|
||
|
# Dont calculate the length using len(query), as this will
|
||
|
# evaluate the whole queryset and return it's length.
|
||
|
# Use .count() instead
|
||
|
return self._origin.count()
|
||
|
|
||
|
|
||
|
def maybe_query(value):
|
||
|
if isinstance(value, Query):
|
||
|
return WrappedQuery(value)
|
||
|
return value
|
||
|
|
||
|
|
||
|
def is_mapped(obj):
|
||
|
return isinstance(obj, DeclarativeMeta)
|