From d36928410629156b0ba1be171e54ca47be4ebb0d Mon Sep 17 00:00:00 2001 From: Johan Castiblanco Date: Fri, 5 Jun 2026 11:32:44 -0500 Subject: [PATCH] feat!: rm user foreign key in db When this model is used with huge traffic, students completing multiple blocks in courses. The User table is also locked with other models. This slow all the inserts and updates using User table. (cherry picked from commit 2db3e3a589d639e419b6dfffaa21c82d2dd13784) --- .../migrations/0004_rm_user_db_foreign_key.py | 21 +++++++++++++++++++ completion/models.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 completion/migrations/0004_rm_user_db_foreign_key.py diff --git a/completion/migrations/0004_rm_user_db_foreign_key.py b/completion/migrations/0004_rm_user_db_foreign_key.py new file mode 100644 index 0000000..29a1735 --- /dev/null +++ b/completion/migrations/0004_rm_user_db_foreign_key.py @@ -0,0 +1,21 @@ +# Dont create User foreign key constraint in db to avoid locking up the user table during course completion updates. + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('completion', '0003_learning_context'), + ] + + operations = [ + migrations.AlterField( + model_name='blockcompletion', + name='user', + field=models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/completion/models.py b/completion/models.py index 338fdc1..a5aa0a0 100644 --- a/completion/models.py +++ b/completion/models.py @@ -208,7 +208,7 @@ class BlockCompletion(TimeStampedModel, models.Model): .. no_pii: """ id = BigAutoField(primary_key=True) # pylint: disable=invalid-name - user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE, db_constraint=False) context_key = LearningContextKeyField(max_length=255, db_column="course_key") # note: this usage key may not have the run filled in for