Django-ninja

Latest version: v1.4.0

Safety actively analyzes 722460 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 7

1.4.0

What's new

**File uploads**

`request.FILES` in non-POST request - basically there is a long story where Django does not set request.FILES for methods like PUT, PATCH
Users were just struggling to understand why their API endpoints are not validating and had to add special middleware that fixes that
Now django ninja will automatically notify user in that case and will ask to add that middleware when user uses non-POST methods

**Pagination**

- Inproved performance for async views with pagination
- PageNumberPagination support page_size (DRF similarity)



**Validation errors**

Requests that fail validation raise `ninja.errors.ValidationError` (not to be confused with `pydantic.ValidationError`).
`ValidationError`s have a default exception handler that returns a 422 (Unprocessable Content) JSON response of the form:
json
{
"detail": [ ... ]
}


**Error context**
Now you can customise it by overwriting the following method:

python
class CustomNinjaAPI(NinjaAPI):
def validation_error_from_error_contexts(self, error_contexts): ...


**pattern= Support**

Regex pattern fully compatible with latest pydantic, allows you to add extra validation in arguments:

python
router.get("/path/param-pattern/{item_id}")
def get_path_param_pattern(request, item_id: str = Path(..., pattern="^foo")):
return item_id


**Custom Django model fields**

there is now a standard way to register custom django field to pydantic type:
python
from ninja.orm import register_field
register_field("MyCustomField", int)



**Throttling**

Throttling now supports multi-period intervals, such as `5/30s`, `10/5m`, and `100/2h`. Previously, the throttling implementation only allowed single-period intervals (e.g., `5/s`, `100/d`), which limited the granularity and flexibility of rate limits.



Full Changelog
* Fix for request.FILES Population on Non-POST Methods by vitalik in https://github.com/vitalik/django-ninja/pull/1423
* Improve Performance for Async Pagination by tim-hub in https://github.com/vitalik/django-ninja/pull/1414
* PageNumberPagination support page_size as API param by zhaozigu in https://github.com/vitalik/django-ninja/pull/1426
* Allow Customizing Validation Errors by jceipek in https://github.com/vitalik/django-ninja/pull/1380
* Add pattern support to param by sunfkny in https://github.com/vitalik/django-ninja/pull/1336
* Operation default options, addresses 1267 by Ksauder in https://github.com/vitalik/django-ninja/pull/1268
* Add IPNetwork and Url serialisation by grigi in https://github.com/vitalik/django-ninja/pull/1349
* add register_type public function by vitalik in https://github.com/vitalik/django-ninja/pull/1352
* Distinguish between AuthenticationError and AuthorizationError by c4ffein in https://github.com/vitalik/django-ninja/pull/1257
* Add method to check is user either staff or superuser. by adambirds in https://github.com/vitalik/django-ninja/pull/1409
* Support multi-period intervals in throttling by robhudson in https://github.com/vitalik/django-ninja/pull/1373
* Add query parameters in request_params for testing by zhaozigu in https://github.com/vitalik/django-ninja/pull/1422
* fix - schema crashes when paginated and from __future__ import annotations by vitalik in https://github.com/vitalik/django-ninja/pull/1425
* Ensure router auth always overrides api auth by default by vitalik in https://github.com/vitalik/django-ninja/pull/1427
* Fix of TypeError when returning None in AuthBase.__call__ from async code 1386 by mmkhitaryan in https://github.com/vitalik/django-ninja/pull/1387


Tests
* Fixed coverage on Python>=3.11 by c4ffein in https://github.com/vitalik/django-ninja/pull/1276
* Update code with `make fmt` and the pipeline to use the same `--preview` option of Ruff by c4ffein in https://github.com/vitalik/django-ninja/pull/1274
* CI: Use Ubuntu 22 for 3.7 support in tests by pmdevita in https://github.com/vitalik/django-ninja/pull/1408

Docs

* Made TestClient accept COOKIES + documentation by c4ffein in https://github.com/vitalik/django-ninja/pull/1311
* Better csrf doc by c4ffein in https://github.com/vitalik/django-ninja/pull/1314
* fix small typo in throttling docs by noahgorstein in https://github.com/vitalik/django-ninja/pull/1316
* Small typo fixes and doc mention router import by michaelg100 in https://github.com/vitalik/django-ninja/pull/1317
* document how to use an optional file input by toudi in https://github.com/vitalik/django-ninja/pull/1326
* fix typos in docs by ahmetveburak in https://github.com/vitalik/django-ninja/pull/1333
* Adding docs how to add a user in a test by pinguin999 in https://github.com/vitalik/django-ninja/pull/1341
* Replace update_forward_refs with model_rebuild in docs by Danie-1 in https://github.com/vitalik/django-ninja/pull/1366
* Updated docs for url parameters in nested routers by kentrh in https://github.com/vitalik/django-ninja/pull/1365
* fix spelling error in pagination.md by syre in https://github.com/vitalik/django-ninja/pull/1287
* Update LICENSE, fix copyright license year by JasonnnW3000 in https://github.com/vitalik/django-ninja/pull/1379


New Contributors
* Ksauder made their first contribution in https://github.com/vitalik/django-ninja/pull/1268
* syre made their first contribution in https://github.com/vitalik/django-ninja/pull/1287
* michaelg100 made their first contribution in https://github.com/vitalik/django-ninja/pull/1317
* toudi made their first contribution in https://github.com/vitalik/django-ninja/pull/1326
* ahmetveburak made their first contribution in https://github.com/vitalik/django-ninja/pull/1333
* sunfkny made their first contribution in https://github.com/vitalik/django-ninja/pull/1336
* pinguin999 made their first contribution in https://github.com/vitalik/django-ninja/pull/1341
* grigi made their first contribution in https://github.com/vitalik/django-ninja/pull/1349
* Danie-1 made their first contribution in https://github.com/vitalik/django-ninja/pull/1366
* robhudson made their first contribution in https://github.com/vitalik/django-ninja/pull/1373
* kentrh made their first contribution in https://github.com/vitalik/django-ninja/pull/1365
* JasonnnW3000 made their first contribution in https://github.com/vitalik/django-ninja/pull/1379
* jceipek made their first contribution in https://github.com/vitalik/django-ninja/pull/1380
* adambirds made their first contribution in https://github.com/vitalik/django-ninja/pull/1409
* pmdevita made their first contribution in https://github.com/vitalik/django-ninja/pull/1408
* zhaozigu made their first contribution in https://github.com/vitalik/django-ninja/pull/1422
* tim-hub made their first contribution in https://github.com/vitalik/django-ninja/pull/1414
* mmkhitaryan made their first contribution in https://github.com/vitalik/django-ninja/pull/1387

**Full Changelog**: https://github.com/vitalik/django-ninja/compare/v1.3.0...v1.4.0b1

1.4.0b1

What's Changed
* Fix for request.FILES Population on Non-POST Methods by vitalik in https://github.com/vitalik/django-ninja/pull/1423
* Improve Performance for Async Pagination by tim-hub in https://github.com/vitalik/django-ninja/pull/1414
* PageNumberPagination support page_size as API param by zhaozigu in https://github.com/vitalik/django-ninja/pull/1426
* Allow Customizing Validation Errors by jceipek in https://github.com/vitalik/django-ninja/pull/1380
* Add pattern support to param by sunfkny in https://github.com/vitalik/django-ninja/pull/1336
* Operation default options, addresses 1267 by Ksauder in https://github.com/vitalik/django-ninja/pull/1268
* Add IPNetwork and Url serialisation by grigi in https://github.com/vitalik/django-ninja/pull/1349
* add register_type public function by vitalik in https://github.com/vitalik/django-ninja/pull/1352
* Distinguish between AuthenticationError and AuthorizationError by c4ffein in https://github.com/vitalik/django-ninja/pull/1257
* Add method to check is user either staff or superuser. by adambirds in https://github.com/vitalik/django-ninja/pull/1409
* Support multi-period intervals in throttling by robhudson in https://github.com/vitalik/django-ninja/pull/1373
* Add query parameters in request_params for testing by zhaozigu in https://github.com/vitalik/django-ninja/pull/1422
* fix - schema crashes when paginated and from __future__ import annotations by vitalik in https://github.com/vitalik/django-ninja/pull/1425
* Ensure router auth always overrides api auth by default by vitalik in https://github.com/vitalik/django-ninja/pull/1427
* Fix of TypeError when returning None in AuthBase.__call__ from async code 1386 by mmkhitaryan in https://github.com/vitalik/django-ninja/pull/1387


Tests
* Fixed coverage on Python>=3.11 by c4ffein in https://github.com/vitalik/django-ninja/pull/1276
* Update code with `make fmt` and the pipeline to use the same `--preview` option of Ruff by c4ffein in https://github.com/vitalik/django-ninja/pull/1274
* CI: Use Ubuntu 22 for 3.7 support in tests by pmdevita in https://github.com/vitalik/django-ninja/pull/1408

Docs

* Made TestClient accept COOKIES + documentation by c4ffein in https://github.com/vitalik/django-ninja/pull/1311
* Better csrf doc by c4ffein in https://github.com/vitalik/django-ninja/pull/1314
* fix small typo in throttling docs by noahgorstein in https://github.com/vitalik/django-ninja/pull/1316
* Small typo fixes and doc mention router import by michaelg100 in https://github.com/vitalik/django-ninja/pull/1317
* document how to use an optional file input by toudi in https://github.com/vitalik/django-ninja/pull/1326
* fix typos in docs by ahmetveburak in https://github.com/vitalik/django-ninja/pull/1333
* Adding docs how to add a user in a test by pinguin999 in https://github.com/vitalik/django-ninja/pull/1341
* Replace update_forward_refs with model_rebuild in docs by Danie-1 in https://github.com/vitalik/django-ninja/pull/1366
* Updated docs for url parameters in nested routers by kentrh in https://github.com/vitalik/django-ninja/pull/1365
* fix spelling error in pagination.md by syre in https://github.com/vitalik/django-ninja/pull/1287
* Update LICENSE, fix copyright license year by JasonnnW3000 in https://github.com/vitalik/django-ninja/pull/1379


New Contributors
* Ksauder made their first contribution in https://github.com/vitalik/django-ninja/pull/1268
* syre made their first contribution in https://github.com/vitalik/django-ninja/pull/1287
* michaelg100 made their first contribution in https://github.com/vitalik/django-ninja/pull/1317
* toudi made their first contribution in https://github.com/vitalik/django-ninja/pull/1326
* ahmetveburak made their first contribution in https://github.com/vitalik/django-ninja/pull/1333
* sunfkny made their first contribution in https://github.com/vitalik/django-ninja/pull/1336
* pinguin999 made their first contribution in https://github.com/vitalik/django-ninja/pull/1341
* grigi made their first contribution in https://github.com/vitalik/django-ninja/pull/1349
* Danie-1 made their first contribution in https://github.com/vitalik/django-ninja/pull/1366
* robhudson made their first contribution in https://github.com/vitalik/django-ninja/pull/1373
* kentrh made their first contribution in https://github.com/vitalik/django-ninja/pull/1365
* JasonnnW3000 made their first contribution in https://github.com/vitalik/django-ninja/pull/1379
* jceipek made their first contribution in https://github.com/vitalik/django-ninja/pull/1380
* adambirds made their first contribution in https://github.com/vitalik/django-ninja/pull/1409
* pmdevita made their first contribution in https://github.com/vitalik/django-ninja/pull/1408
* zhaozigu made their first contribution in https://github.com/vitalik/django-ninja/pull/1422
* tim-hub made their first contribution in https://github.com/vitalik/django-ninja/pull/1414
* mmkhitaryan made their first contribution in https://github.com/vitalik/django-ninja/pull/1387

**Full Changelog**: https://github.com/vitalik/django-ninja/compare/v1.3.0...v1.4.0b1

1.3.0

This version brings few enahcments

1) Serialisation context now has request and response code

Python
class SchemaWithCustomSerializer(Schema):
test1: str
test2: str

model_serializer(mode="wrap")
def ser_model(self, handler, info):
request = info.context["request"] !!!
response_status = info.context["response_status"] !!!
return handler(self)


2) With `PatchDict` you can quickly define schemas with all optional fields and use it as dict with ONLY fields that were passed in request payload (aka patch requests)


Python
from ninja import PatchDict

class SomeSchema(Schema):
name: str
description: str
due_date: date
Note all fields a required


api.patch("/patch")
def modify_data(request, payload: PatchDict[SomeSchema]):
payload ! <--- payload is a type of dict and contains only keys that were passed in request body (validated with SomeSchema)

for attr, value in payload.items():
setattr(obj, attr, value)

obj.save()


All changes
* Support import string in router.add_router by martinsvoboda in https://github.com/vitalik/django-ninja/pull/1256
* Add default headers for NinjaClientBase instance by c4ffein in https://github.com/vitalik/django-ninja/pull/1259
* Fix issue when consulting request attributes while using mocked request by acuriel in https://github.com/vitalik/django-ninja/pull/1244
* Allow generic filter types by eugenenelou in https://github.com/vitalik/django-ninja/pull/1212
* DRF-style data property for responses in tests by c4ffein in https://github.com/vitalik/django-ninja/pull/1260
* Pass serialisation context to model_dump (fixes 1233) by scorpp in https://github.com/vitalik/django-ninja/pull/1261
* PatchDict util by vitalik in https://github.com/vitalik/django-ninja/pull/1262

New Contributors
* martinsvoboda made their first contribution in https://github.com/vitalik/django-ninja/pull/1256
* acuriel made their first contribution in https://github.com/vitalik/django-ninja/pull/1244
* eugenenelou made their first contribution in https://github.com/vitalik/django-ninja/pull/1212
* scorpp made their first contribution in https://github.com/vitalik/django-ninja/pull/1261

**Full Changelog**: https://github.com/vitalik/django-ninja/compare/v1.2.2...v1.3.0

1.2.2

What's Changed
* Fix unchanging field bug when validate assignment true by austinpgraham in https://github.com/vitalik/django-ninja/pull/1232


**Full Changelog**: https://github.com/vitalik/django-ninja/compare/v1.2.1...v1.2.2

1.2.1

Fixed throttling in async mode

1.2.0

What's new

with most notable

- **Async Pagination** support by jamesrkiger
- and [Throttling](https://django-ninja.dev/guides/throttling/)

All changes:
* Throttling by vitalik in https://github.com/vitalik/django-ninja/pull/1208
* Async Pagination support by jamesrkiger in https://github.com/vitalik/django-ninja/pull/1030
* Fix ForwardRef._evaluate() missing 1 required keyword-only argument on python 3.12.4 by Object905 in https://github.com/vitalik/django-ninja/pull/1204
* fix: validation of nullable fields with a non-null default value by julienc91 in https://github.com/vitalik/django-ninja/pull/1181
* Add ORM support for SmallAutoField by jlost in https://github.com/vitalik/django-ninja/pull/1185
* Expose django_auth_superuser through __all__ by mostthingsweb in https://github.com/vitalik/django-ninja/pull/992
* Fix dict when validate assignment true by austinpgraham in https://github.com/vitalik/django-ninja/pull/1024
* Fix 1088 : Inconsistency in indentation by Nirmalkumar6112 in https://github.com/vitalik/django-ninja/pull/1091
* Update LimitOffsetPagination.Input schema by kajiczech in https://github.com/vitalik/django-ninja/pull/1134
* Delete setup.py by jeffwidman in https://github.com/vitalik/django-ninja/pull/1138
* chore: modernize ruff config to work with ruff >= v0.2 by afuetterer in https://github.com/vitalik/django-ninja/pull/1120
* chore: update ruff pre-commit version by afuetterer in https://github.com/vitalik/django-ninja/pull/1121
* Minor Typing Improvement for `FilterSchema` by max-muoto in https://github.com/vitalik/django-ninja/pull/1039
* Fix typing for Exception Handlers by max-muoto in https://github.com/vitalik/django-ninja/pull/1130
* Add Generic Typing for `decorate_view` to resolve Pyright Issues by max-muoto in https://github.com/vitalik/django-ninja/pull/1126
* Fix Ninja Schema Typing by max-muoto in https://github.com/vitalik/django-ninja/pull/1165


Docs
* pagination: fix comment about default class by ivoire in https://github.com/vitalik/django-ninja/pull/1034
* Fix typo by Hisham-Pak in https://github.com/vitalik/django-ninja/pull/1054
* docs(form-data): add missing slash by Zerotask in https://github.com/vitalik/django-ninja/pull/1074
* docs(file-uploads): minor adjustments by Zerotask in https://github.com/vitalik/django-ninja/pull/1075
* docs(response): add link for error responses by Zerotask in https://github.com/vitalik/django-ninja/pull/1135
* Fix TestClient name in testing docs by adriaanwm in https://github.com/vitalik/django-ninja/pull/1102
* docs(operations): minor adjustments by Zerotask in https://github.com/vitalik/django-ninja/pull/1076
* Add dark mode to ninja docs by Hisham-Pak in https://github.com/vitalik/django-ninja/pull/1056
* Docs: Adds an example to show how exclude_unset works by benjaoming in https://github.com/vitalik/django-ninja/pull/1173
* fix typo in guides/input/filtering by Moe-Hassan-123 in https://github.com/vitalik/django-ninja/pull/994
* Minor documentation tweaks by jonklo in https://github.com/vitalik/django-ninja/pull/1010
* Cleanup documentation warnings by jlucas91 in https://github.com/vitalik/django-ninja/pull/1021
* Add basic testing documentation by jlucas91 in https://github.com/vitalik/django-ninja/pull/1020
* Fix README.md test badge by jlucas91 in https://github.com/vitalik/django-ninja/pull/1018
* Update django-pydantic-create-schema.md by pradipthinkitive in https://github.com/vitalik/django-ninja/pull/1043

New Contributors
* mostthingsweb made their first contribution in https://github.com/vitalik/django-ninja/pull/992
* Moe-Hassan-123 made their first contribution in https://github.com/vitalik/django-ninja/pull/994
* jonklo made their first contribution in https://github.com/vitalik/django-ninja/pull/1010
* jlucas91 made their first contribution in https://github.com/vitalik/django-ninja/pull/1018
* austinpgraham made their first contribution in https://github.com/vitalik/django-ninja/pull/1024
* max-muoto made their first contribution in https://github.com/vitalik/django-ninja/pull/1039
* pradipthinkitive made their first contribution in https://github.com/vitalik/django-ninja/pull/1043
* Hisham-Pak made their first contribution in https://github.com/vitalik/django-ninja/pull/1054
* Zerotask made their first contribution in https://github.com/vitalik/django-ninja/pull/1074
* jeffwidman made their first contribution in https://github.com/vitalik/django-ninja/pull/1136
* Nirmalkumar6112 made their first contribution in https://github.com/vitalik/django-ninja/pull/1091
* kajiczech made their first contribution in https://github.com/vitalik/django-ninja/pull/1134
* afuetterer made their first contribution in https://github.com/vitalik/django-ninja/pull/1120
* adriaanwm made their first contribution in https://github.com/vitalik/django-ninja/pull/1102
* benjaoming made their first contribution in https://github.com/vitalik/django-ninja/pull/1173
* Object905 made their first contribution in https://github.com/vitalik/django-ninja/pull/1204
* julienc91 made their first contribution in https://github.com/vitalik/django-ninja/pull/1181
* jlost made their first contribution in https://github.com/vitalik/django-ninja/pull/1185

**Full Changelog**: https://github.com/vitalik/django-ninja/compare/v1.1.0...v1.2.0

Page 1 of 7

© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.