Skip to content

Classes

Python classes should be defined as Pydantic models to be supported.

Classes with only primitive types

Starting with a simple example,

main.py
from fastapi import FastAPI
from fastgraphql import FastGraphQL
from fastgraphql.fastapi import make_ariadne_fastapi_router

from pydantic import BaseModel

app = FastAPI()
fast_graphql = FastGraphQL()


@fast_graphql.type()
class Person(BaseModel):
    first_name: str
    last_name: str
    age: int
    height: float


@fast_graphql.query()
def get_person() -> Person:
    return Person(first_name="Luke", last_name="Skywalker", height=1.7, age=23)


app.include_router(make_ariadne_fastapi_router(fast_graphql=fast_graphql))

then execute,

$ uvicorn main:app --reload

open http://127.0.0.1:8000/graphql

and Vuolà 🥳!

Image

Star Wars 🚀

Please don't take the Star Wars references so seriously. The height and age of Luke Skywalker may vary depending on the episode😄.

Dissecting the Code

Again, taking a closer look into the code.

Step 1: Importing BaseModel

main.py
from fastapi import FastAPI
from fastgraphql import FastGraphQL
from fastgraphql.fastapi import make_ariadne_fastapi_router

from pydantic import BaseModel

app = FastAPI()
fast_graphql = FastGraphQL()


@fast_graphql.type()
class Person(BaseModel):
    first_name: str
    last_name: str
    age: int
    height: float


@fast_graphql.query()
def get_person() -> Person:
    return Person(first_name="Luke", last_name="Skywalker", height=1.7, age=23)


app.include_router(make_ariadne_fastapi_router(fast_graphql=fast_graphql))

Here we import Pydantic's base class for all models, pydantic.BaseModel. As mentioned already, this is the base class for all classes handled by FastGraphQL.

Step 2: Annotating your class

main.py
from fastapi import FastAPI
from fastgraphql import FastGraphQL
from fastgraphql.fastapi import make_ariadne_fastapi_router

from pydantic import BaseModel

app = FastAPI()
fast_graphql = FastGraphQL()


@fast_graphql.type()
class Person(BaseModel):
    first_name: str
    last_name: str
    age: int
    height: float


@fast_graphql.query()
def get_person() -> Person:
    return Person(first_name="Luke", last_name="Skywalker", height=1.7, age=23)


app.include_router(make_ariadne_fastapi_router(fast_graphql=fast_graphql))

fastgraphql.FastGraphQL.type() is used to annotate classes that will be part of the GraphQL schema.

Best Practices

Even though fastgraphql.FastGraphQL.type() can be omitted, if the class is being used by a query or mutation and if there is no naming conflict, annotating your classes should be considered a best-practice

Customizations

fastgraphql.FastGraphQL.type() and internal class attributes can be customized. This topic will be covered in Classes Customizations

Step 3: Defining your class

main.py
from fastapi import FastAPI
from fastgraphql import FastGraphQL
from fastgraphql.fastapi import make_ariadne_fastapi_router

from pydantic import BaseModel

app = FastAPI()
fast_graphql = FastGraphQL()


@fast_graphql.type()
class Person(BaseModel):
    first_name: str
    last_name: str
    age: int
    height: float


@fast_graphql.query()
def get_person() -> Person:
    return Person(first_name="Luke", last_name="Skywalker", height=1.7, age=23)


app.include_router(make_ariadne_fastapi_router(fast_graphql=fast_graphql))

Models can be defined exactly as described in Pydantic's documentation. Take a pick under Basic model usage

Step 4: Use your class

main.py
from fastapi import FastAPI
from fastgraphql import FastGraphQL
from fastgraphql.fastapi import make_ariadne_fastapi_router

from pydantic import BaseModel

app = FastAPI()
fast_graphql = FastGraphQL()


@fast_graphql.type()
class Person(BaseModel):
    first_name: str
    last_name: str
    age: int
    height: float


@fast_graphql.query()
def get_person() -> Person:
    return Person(first_name="Luke", last_name="Skywalker", height=1.7, age=23)


app.include_router(make_ariadne_fastapi_router(fast_graphql=fast_graphql))

As in the previous chapter, we annotate a function with @fast_graphql.query(), define the function signature and return type, and we are done!