Django model with foreign key onto settings.AUTH_USER_MODEL fails when app is incorporated into other app using postgres

I have a survey app that works fine as a standalone app with no complaints (using sqlite). But when I incorporate the survey app into another that is using postgres as a database, it fails to run the survey app's migrations, complaining that the owner_id (foreign_key to settings.AUTH_USER_MODEL) of the survey table contains null values. django complains that column "owner_id" of relation "djf_surveys_survey" contains null values the postgres statement is :

STATEMENT:  ALTER TABLE "djf_surveys_survey" ADD COLUMN "owner_id" bigint NOT NULL CONSTRAINT 
"djf_surveys_survey_owner_id_f1d8e19a_fk_users_user_id" REFERENCES "users_user"("id") 
 DEFERRABLE INITIALLY DEFERRED;
 SET CONSTRAINTS "djf_surveys_survey_owner_id_f1d8e19a_fk_users_user_id" IMMEDIATE

My model's foreign key line is:

owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

Its a simple foreignkey relationship. I haven't ever seen this before, and a reasonable google search has shown nothing that seems relevant. I don't understand why the postgres sql would create the column as deferrable and then add a constraint that makes it IMMEDIATE...

The complete stack trace is as follows... (MTIA...:)

mind_survey_app_local_django        | Running migrations:
mind_survey_app_local_postgres      | 2025-12-31 15:37:17.848 UTC [37] ERROR:  column "owner_id" of relation "djf_surveys_survey" contains null values
mind_survey_app_local_postgres      | 2025-12-31 15:37:17.848 UTC [37] STATEMENT:  ALTER TABLE "djf_surveys_survey" ADD COLUMN "owner_id" bigint NOT NULL CONSTRAINT "djf_surveys_survey_owner_id_f1d8e19a_fk_users_user_id" REFERENCES "users_user"("id") DEFERRABLE INITIALLY DEFERRED; SET CONSTRAINTS "djf_surveys_survey_owner_id_f1d8e19a_fk_users_user_id" IMMEDIATE
mind_survey_app_local_django        | Traceback (most recent call last):
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 103, in _execute
mind_survey_app_local_django        |     return self.cursor.execute(sql)
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/psycopg/cursor.py", line 97, in execute
mind_survey_app_local_django        |     raise ex.with_traceback(None)
mind_survey_app_local_django        | psycopg.errors.NotNullViolation: column "owner_id" of relation "djf_surveys_survey" contains null values
mind_survey_app_local_django        | 
mind_survey_app_local_django        | The above exception was the direct cause of the following exception:
mind_survey_app_local_django        | 
mind_survey_app_local_django        | Traceback (most recent call last):
mind_survey_app_local_django        |   File "/app/manage.py", line 30, in <module>
mind_survey_app_local_django        |     main()
mind_survey_app_local_django        |   File "/app/manage.py", line 26, in main
mind_survey_app_local_django        |     execute_from_command_line(sys.argv)
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
mind_survey_app_local_django        |     utility.execute()
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 436, in execute
mind_survey_app_local_django        |     self.fetch_command(subcommand).run_from_argv(self.argv)
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 413, in run_from_argv
mind_survey_app_local_django        |     self.execute(*args, **cmd_options)
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 459, in execute
mind_survey_app_local_django        |     output = self.handle(*args, **options)
mind_survey_app_local_django        |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 107, in wrapper
mind_survey_app_local_django        |     res = handle_func(*args, **kwargs)
mind_survey_app_local_django        |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/core/management/commands/migrate.py", line 357, in handle
mind_survey_app_local_django        |     post_migrate_state = executor.migrate(
mind_survey_app_local_django        |                          ^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/migrations/executor.py", line 135, in migrate
mind_survey_app_local_django        |     state = self._migrate_all_forwards(
mind_survey_app_local_django        |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/migrations/executor.py", line 167, in _migrate_all_forwards
mind_survey_app_local_django        |     state = self.apply_migration(
mind_survey_app_local_django        |             ^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/migrations/executor.py", line 255, in apply_migration
mind_survey_app_local_django        |     state = migration.apply(state, schema_editor)
mind_survey_app_local_django        |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/migrations/migration.py", line 132, in apply
mind_survey_app_local_django        |     operation.database_forwards(
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/migrations/operations/fields.py", line 110, in database_forwards
mind_survey_app_local_django        |     schema_editor.add_field(
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/schema.py", line 768, in add_field
mind_survey_app_local_django        |     self.execute(sql, params or None)
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/postgresql/schema.py", line 45, in execute
mind_survey_app_local_django        |     return super().execute(sql, params)
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/schema.py", line 202, in execute
mind_survey_app_local_django        |     cursor.execute(sql, params)
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 122, in execute
mind_survey_app_local_django        |     return super().execute(sql, params)
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 79, in execute
mind_survey_app_local_django        |     return self._execute_with_wrappers(
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
mind_survey_app_local_django        |     return executor(sql, params, many, context)
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 100, in _execute
mind_survey_app_local_django        |     with self.db.wrap_database_errors:
mind_survey_app_local_django        |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/utils.py", line 91, in __exit__
mind_survey_app_local_django        |     raise dj_exc_value.with_traceback(traceback) from exc_value
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/django/db/backends/utils.py", line 103, in _execute
mind_survey_app_local_django        |     return self.cursor.execute(sql)
mind_survey_app_local_django        |            ^^^^^^^^^^^^^^^^^^^^^^^^
mind_survey_app_local_django        |   File "/usr/local/lib/python3.12/site-packages/psycopg/cursor.py", line 97, in execute
mind_survey_app_local_django        |     raise ex.with_traceback(None)
mind_survey_app_local_django        | django.db.utils.IntegrityError: column "owner_id" of relation "djf_surveys_survey" contains null values
mind_survey_app_local_flower        | Error: No nodes replied within time constraint
mind_survey_app_local_django        |   Applying djf_surveys.0034_survey_owner_surveyselection_owner...
mind_survey_app_local_flower        | Celery workers not available
mind_survey_app_local_celerybeat    | celery beat v5.5.3 (immunity) is starting.
mind_survey_app_local_django exited with code 1

Ok, so I was using django-cookiecutter for the main app, using the docker configuration, and I was running the following command each time I rebuilt in order to delete the build-cache and download the latest push to the survey app.

docker system prune -a --volumes

It turned out that it only deletes anonymous volumes. The postgres mounted volume was remaining, and the database had data in it, which I first cleared, before realising that the migrations weren't pushing so the owner column wasn't being created. So I deleted the volumes using the docker volume rm [volumename] after pruning as above, and then when it built everything worked ok.

Вернуться на верх