Package: django-extra-checks
Django Extra ChecksCollection of useful checks for Django Checks FrameworksChecksModelsextra-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 fromattrssetting specified.model-meta-attribute- Each Model.Meta in the project must have all attributes fromattrssetting specified.no-unique-together- UseUniqueConstraintwith theconstraintsoption instead.no-index-together- [DEPRECATED] Use theindexesoption 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 usenull=True.field-boolean-null- [DEPRECATED] prefer usingBooleanField(null=True)instead ofNullBooleanField.field-null- don't passnull=Falseto model fields (this is django default).field-foreign-key-db-index- ForeignKey fields must specifydb_indexexplicitly (to apply only to fields in indexes:when: indexes).field-related-name- Related fields must specifyrelated_nameexplicitly.field-default-null- If field nullable (null=True), thendefault=Noneargument is redundant and should be removed.WARNINGBe 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 Serializersdrf-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 inattrs,use case.InstallationInstall withpip install django-extra-checksAddextra_checkstoINSTALLED_APPS(useextra_checks.apps.ExtraChecksConfigfor Django versions prior to 3.2).SettingsTo enable some check defineEXTRA_CHECKSsetting 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 useinclude_appsoption 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 problemsUseextra-checks-disable-next-linecomment to disable checks:# disable specific checks on model# extra-checks-disable-next-line model-attribute, model-adminclassMyModel(models.Model):# disable all checks on image field# extra-checks-disable-next-lineimage=models.ImageField()# separate comments and check's codes are also supported# extra-checks-disable-next-line X014# extra-checks-disable-next-line no-unique-togetherclassMeta:...Another way is to provide function that accepts field, model or
serializer class as its first argument and returnsTrueif it must be skipped.Be aware that the more computation expensive your skipif functions the
slower django check will run.skipifexample:defskipif_streamfield(field,*args,**kwargs):returnisinstance(field,wagtail.core.fields.StreamField)defskipif_non_core_app(model_cls,*args,**kwargs):returnmodel_cls._meta.app_label!="my_core_app"EXTRA_CHECKS={"check":[{"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,},]}DevelopmentInstall dev deps in virtualenvpip install -e .[dev,test].CreditsThe project was built using ideas and code snippets from:Haki BenitaJon DufresneAdam Johnson