﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
35920	Migrate command runs system checks regardless of the value of requires_system_checks	Jacob Walls	Jacob Walls	"Without `--skip-checks=False`, the `migrate` command runs system checks regardless of the value of  `requires_system_checks`, which is `[]` by [https://github.com/django/django/blob/4c452cc377f6f43acd90c6e54826ebd2e6219b0d/django/core/management/commands/migrate.py#L22 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.

----

- I wrote a system check following the [https://docs.djangoproject.com/en/5.1/topics/checks/#field-model-manager-template-engine-and-database-checks 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 migrate` my check ran before my column was added, raising `ProgrammingError`.
- I verified `--skip-checks` works like a charm, but I don't want to impose cryptic failures on my fellow developers who expect plain `migrate` to work.
- I attempted to override the `migrate` command 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-checks` still works; here, I have to avoid it being added again): 
{{{#!diff
diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py
index fa420ee6e3..4000d76f3b 100644
--- a/django/core/management/commands/migrate.py
+++ b/django/core/management/commands/migrate.py
@@ -19,14 +19,9 @@ class Command(BaseCommand):
     help = (
         ""Updates database schema. Manages both apps with migrations and those without.""
     )
-    requires_system_checks = []
+    requires_system_checks = ""__all__""
 
     def add_arguments(self, parser):
-        parser.add_argument(
-            ""--skip-checks"",
-            action=""store_true"",
-            help=""Skip system checks."",
-        )
         parser.add_argument(
             ""app_label"",
             nargs=""?"",
@@ -99,7 +94,7 @@ class Command(BaseCommand):
     def handle(self, *args, **options):
         database = options[""database""]
         if not options[""skip_checks""]:
-            self.check(databases=[database])
+            self.check(tags=self.requires_system_checks, databases=[database])
 
         self.verbosity = options[""verbosity""]
         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 :-)"	Bug	assigned	Core (Management commands)	5.1	Normal		skip-checks		Unreviewed	0	0	0	0	0	0
