Django Extra Checks
Collection of useful checks for Django Checks Frameworks
Checks
Models
- extra-checks-config - settings.EXTRA_CHECKS is valid config for django-extra-checks (always enabled).
- model-attribute - Each Model in the project must have all attributes from
attrssetting specified. - model-meta-attribute - Each Model.Meta in the project must have all attributes from
attrssetting specified. - no-unique-together - Use
UniqueConstraintwith theconstraintsoption instead. - model-admin - Each model must be registered in admin.
- field-file-upload-to -
FileField/ImageFieldmust have non emptyupload_toargument. - field-verbose-name - All model's fields must have verbose name.
- field-verbose-name-gettext -
verbose_namemust use gettext. - field-verbose-name-gettext-case - Words in text wrapped with gettext must be in one case.
- field-help-text-gettext -
help_textmust use gettext. - field-text-null - text fields shouldn't use
null=True. - field-null - don't pass
null=Falseto model fields (this is django default). - field-foreign-key-db-index - ForeignKey fields must specify
db_indexexplicitly (to apply only to fields in indexes:when: indexes). - field-related-name - Related fields must specify
related_nameexplicitly. - field-default-null - If field nullable (
null=True), thendefault=Noneargument is redundant and should be removed. WARNING Be aware that setting is database dependent, eg. Oracle interprets empty strings as nulls as a result django uses empty string instead of null as default. - field-choices-constraint - Fields with choices must have companion CheckConstraint to enforce choices on database level, details.
DRF Serializers
- drf-model-serializer-extra-kwargs - ModelSerializer's extra_kwargs must not include fields that specified on serializer.
- drf-model-serializer-meta-attribute - Each ModelSerializer.Meta must have all attributes specified in
attrs, use case.
Installation
Install with pip install django-extra-checks
Add extra_checks to INSTALLED_APPS in your Django settings:
INSTALLED_APPS = [
...,
"django.contrib.admin", # make sure this comes before 'extra_checks' if you plan to use the `model-admin` check
"extra_checks",
...
]
Settings
To enable some check define EXTRA_CHECKS setting with a dict of checks and its settings:
EXTRA_CHECKS = {
"checks": [
# require non empty `upload_to` argument.
"field-file-upload-to",
# use dict form if check need configuration
# eg. all models must have fk to Site model
{"id": "model-attribute", "attrs": ["site"]},
# require `db_table` for all models, increase level to CRITICAL
{"id": "model-meta-attribute", "attrs": ["db_table"], "level": "CRITICAL"},
]
}
By default only your project apps are checked but you can use
include_apps option to specify apps to check (including third party apps):
EXTRA_CHECKS = {
# use same names as in INSTALLED_APPS
"include_apps": ["django.contrib.sites", "my_app"],
...
}
Ignoring check problems
Use extra-checks-disable-next-line comment to disable checks:
# disable specific checks on model
# extra-checks-disable-next-line model-attribute, model-admin
class MyModel(models.Model):
# disable all checks on image field
# extra-checks-disable-next-line
image = models.ImageField()
# separate comments and check's codes are also supported
# extra-checks-disable-next-line X014
# extra-checks-disable-next-line no-unique-together
class Meta:
...
Another way is to provide function that accepts field, model or
serializer class as its first argument and returns True if it must be skipped.
Be aware that the more computation expensive your skipif functions the
slower django check will run.
skipif example:
def skipif_streamfield(field, *args, **kwargs):
return isinstance(field, wagtail.core.fields.StreamField)
def skipif_non_core_app(model_cls, *args, **kwargs):
return model_cls._meta.app_label != "my_core_app"
EXTRA_CHECKS = {
"checks": [
{
"id": "field-verbose-name-gettext",
# make this check skip wagtail's StreamField
"skipif": skipif_streamfield
},
{
"id": "model-admin",
# models from non core app shouldn't be registered in admin
"skipif": skipif_non_core_app,
},
]
}
Development
Install dev deps in virtualenv uv sync, run tests uv run pytest.
Credits
The project was built using ideas and code snippets from:
Metadata
Release files for django-extra-checks 0.17.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| django_extra_checks-0.17.0.tar.gz | 14.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_extra_checks-0.17.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.2 kB
Release files / django_extra_checks-0.17.0.tar.gz
| Download URL | django_extra_checks-0.17.0.tar.gz |
|---|---|
| Size | 14.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
619f79f37de23931d08539ed97b2b945c2887c73f753eccc98544ffd3f7d3e60
|
|
BLAKE2b-256 checksum How to use checksums |
632b2ce50c5736d00a39f737944d7a174cef154368b0b10a6164c614a60c22ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 21, 2026.
Transparency logRelease files / django_extra_checks-0.17.0-py3-none-any.whl
| Download URL | django_extra_checks-0.17.0-py3-none-any.whl |
|---|---|
| Size | 21.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f41e2e4455e5467aa9b3e28500d4d140b9fb9eedf5e42e0fb71498846813608a
|
|
BLAKE2b-256 checksum How to use checksums |
583d92f6b4727b936ed293eafad1236600cb7bd36b27d189abea59dd6f65bebf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 21, 2026.
Transparency logSecurity for django-extra-checks 0.17.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for django_extra_checks-0.17.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.