Private Fields#

Private (external) fields can provide local context for later resolution. These fields will act as plain fields so will not be exposed in the GraphQL API.

Some uses include:

  • Context that relies upon field inputs.

  • Avoiding fully materializing an object hierarchy (lazy resolution)

Defining a private field#

Specifying a field with strawberry.Private[...] will desigate it as internal and not for GraphQL.

Example#

Consider the following type, which can accept any Python object and handle converting it to string, representation, or templated output:


@strawberry.type
class Stringable:
    value: strawberry.Private[object]

    @strawberry.field
    def string(self) -> str:
        return str(self.value)

    @strawberry.field
    def repr(self) -> str:
        return repr(self.value)

    @strawberry.field
    def format(self, template: str) -> str:
        return template.format(my=self.value)

The Private[...] type lets Strawberry know that this field is not a GraphQL field. “value” is a regular field on the class, but it is not exposed on the GraphQL API.


@strawberry.type
class Query:
    @strawberry.field
    def now(self) -> Stringable:
        return Stringable(value=datetime.datetime.now())

Queries can then select the fields and formats desired, but formatting only happens as requested:

{
  now {
    format(template: "{my.year}")
    string
    repr
  }
}

---

{
  "data": {
    "now": {
      "format": "2022",
      "string": "2022-09-03 17:03:04.923068",
      "repr": "datetime.datetime(2022, 9, 3, 17, 3, 4, 923068)"
    }
  }
}