FastAPI – GET Request with Pydantic List field

It is not, as yet, possible to use a GET request with Pydantic List field as query parameter. When you declare a List field in the Pydantic model, it is interpreted as a request body parameter, instead of a query one (regardless of using Depends()—you can check that through Swagger UI docs at http://127.0.0.1:8000/docs, for instance). Additionally, as you are using a GET request, even if you added the List of directions in the body and attempted sending the request, it wouldn’t work, as a POST request would be required for that operation.

The way to do this is to either define the List of directions explicitly with Query as a separate parameter in your endpoint, or implement your query parameter-parsing in a separate dependency class, as described here. Remember again to define the List field explicitly with Query, so that directions can be interpreted as a query parameter and appear multiple times in the URL (in others words, to receive multiple values). Example:

from typing import List, Optional
from fastapi import APIRouter, Depends, Query

class SortModel:
    def __init__(
        self,
        field:  Optional[str],
        directions: List[str] = Query(...)
    ):
        self.field = field
        self.directions = directions

router = APIRouter()

@router.get("/")
def send_user(criteria: SortModel = Depends()):
    return criteria

The above can be re-written using the @dataclass decorator, as shown below:

from typing import List, Optional
from fastapi import APIRouter, Depends, Query
from dataclasses import dataclass

@dataclass
class SortModel:
    field:    Optional[str]
    directions: List[str] = Query(...)

router = APIRouter()

@router.get("/")
def send_user(criteria: SortModel = Depends()):
    return criteria

Leave a Comment