Opened 12 months ago
Last modified 11 months ago
#35920 closed Bug
Migrate command runs system checks regardless of the value of requires_system_checks — at Version 1
| Reported by: | Jacob Walls | Owned by: | Jacob Walls | 
|---|---|---|---|
| Component: | Core (Management commands) | Version: | 5.1 | 
| Severity: | Normal | Keywords: | skip-checks | 
| Cc: | Simon Charette, Hasan Ramezani | Triage Stage: | Ready for checkin | 
| Has patch: | yes | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description (last modified by )
Without --skip-checks=False, the migrate command runs system checks regardless of the value of  requires_system_checks, which is [] by default (itself a little misleading) but ultimately something I would like to be able to override at the project level. The fact that [] is not respected and not overridable seems like a bug, and AFAIK it's an asymmetry with other commands. (EDIT: turns out, runserver behaves in a similar way, with a comment from 17 years ago, predating migrations, explaining there is a separate mechanism from the one that became requires_system_checks that runs the system checks. I think we can improve the story here.)
- I wrote a system check following the documented example inside Model.check().
 - I did this as part of a feature adding a new column to my model, and I queried this column in my check. I made the necessary migration.
 - During 
manage.py migratemy check ran before my column was added, raisingProgrammingError. - I verified 
--skip-checksworks like a charm, but I don't want to impose cryptic failures on my fellow developers who expect plainmigrateto work. - I attempted to override the 
migratecommand in my project, like this: 
/app/management/commands/migrate.py
from django.core.checks.registry import registry
from django.core.management.commands.migrate import Command as MigrateCommand
class Command(MigrateCommand):
    # Silence model checks that may depend on new columns.
    requires_system_checks = list(registry.tags_available() - {"models"})
- Result: no change: 
ProgrammingError 
- Then, I added this patch to Django. (
--skip-checksstill works; here, I have to avoid it being added again):- 
      
django/core/management/commands/migrate.py
diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py index fa420ee6e3..4000d76f3b 100644
a b class Command(BaseCommand): 19 19 help = ( 20 20 "Updates database schema. Manages both apps with migrations and those without." 21 21 ) 22 requires_system_checks = []22 requires_system_checks = "__all__" 23 23 24 24 def add_arguments(self, parser): 25 parser.add_argument(26 "--skip-checks",27 action="store_true",28 help="Skip system checks.",29 )30 25 parser.add_argument( 31 26 "app_label", 32 27 nargs="?", … … class Command(BaseCommand): 99 94 def handle(self, *args, **options): 100 95 database = options["database"] 101 96 if not options["skip_checks"]: 102 self.check( databases=[database])97 self.check(tags=self.requires_system_checks, databases=[database]) 103 98 104 99 self.verbosity = options["verbosity"] 105 100 self.interactive = options["interactive"]  
 - 
      
 
- Result: check skipped as expected via my project-level override of the migrate command.
 
I suppose there's another question here about whether Tags.models checks should run as part of the migrate command, or whether the change I made at the project level should be pulled into core, given that this is a reasonably realistic scenario for development? I can take that to the forum later. But at the moment, I'm just hoping to get the override working. Happy to PR this if welcome :-)