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
attrs
setting specified. - model-meta-attribute - Each Model.Meta in the project must have all attributes from
attrs
setting specified. - no-unique-together - Use
UniqueConstraint
with the constraints
option instead. - model-admin - Each model must be registered in admin.
- field-file-upload-to -
FileField
/ ImageField
must have non empty upload_to
argument. - field-verbose-name - All model's fields must have verbose name.
- field-verbose-name-gettext -
verbose_name
must use gettext. - field-verbose-name-gettext-case - Words in text wrapped with gettext must be in one case.
- field-help-text-gettext -
help_text
must use gettext. - field-text-null - text fields shouldn't use
null=True
. - field-null - don't pass
null=False
to model fields (this is django default). - field-foreign-key-db-index - ForeignKey fields must specify
db_index
explicitly (to apply only to fields in indexes: when: indexes
). - field-related-name - Related fields must specify
related_name
explicitly. - field-default-null - If field nullable (
null=True
), then
default=None
argument 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",
"extra_checks",
...
]
Settings
To enable some check define EXTRA_CHECKS
setting with a dict of checks and its settings:
EXTRA_CHECKS = {
"checks": [
"field-file-upload-to",
{"id": "model-attribute", "attrs": ["site"]},
{"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 = {
"include_apps": ["django.contrib.sites", "my_app"],
...
}
Ignoring check problems
Use extra-checks-disable-next-line
comment to disable checks:
class MyModel(models.Model):
image = models.ImageField()
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",
"skipif": skipif_streamfield
},
{
"id": "model-admin",
"skipif": skipif_non_core_app,
},
]
}
Development
Install dev deps in virtualenv pip install -e .[dev,test]
.
Credits
The project was built using ideas and code snippets from: