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.

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