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 :
```postgres
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...:)
```python
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.