Skip to content

Reverse Resolution of URLS

A reverse URL name is generated for each method in a Django Ninja Schema (or Router).

How URLs are generated

The URLs are all contained within a namespace, which defaults to "api-1.0.0", and each URL name matches the function it is decorated.

For example:

api = NinjaAPI()

@api.get("/")
def index(request):
    ...

index_url = reverse_lazy("api-1.0.0:index")

This implicit URL name will only be set for the first operation for each API path. If you don't want any implicit reverse URL name generated, just explicitly specify url_name="" (an empty string) on the method decorator.

Changing the URL name

Rather than using the default URL name, you can specify it explicitly as a property on the method decorator.

@api.get("/users", url_name="user_list")
def users(request):
    ...

users_url = reverse_lazy("api-1.0.0:user_list")

This will override any implicit URL name to this API path.

Overriding default url names

You can also override implicit url naming by overwriting the get_operation_url_name method:

class MyAPI(NinjaAPI):
    def get_operation_url_name(self, operation, router):
        return operation.view_func.__name__ + '_my_extra_suffix'

api = MyAPI()

Customizing the namespace

The default URL namespace is built by prepending the Schema's version with "api-", however you can explicitly specify the namespace by overriding the urls_namespace attribute of the NinjaAPI Schema class.

api = NinjaAPI(auth=token_auth, version='2')
api_private = NinjaAPI(auth=session_auth, urls_namespace='private_api')

api_users_url = reverse_lazy("api-2:users")
private_api_admins_url = reverse_lazy("private_api:admins")