Opened 4 years ago
Closed 4 years ago
#32869 closed Bug (worksforme)
Bug while migrating a OneToOneField to ForeignKey on PostgreSQL.
| Reported by: | suhail vs | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 3.2 |
| Severity: | Normal | Keywords: | postgres onetoonefield foreignkey |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Using PostgreSQL Database I changed a field from OneToOneField to ForeignKey::
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
to
class Customer(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
after migrations, then i tried to create a Customer i got error:
IntegrityError at /admin/myapp/customer/add/ duplicate key value violates unique constraint "myapp_customer_user_id_key" DETAIL: Key (user_id)=(1) already exists. Request Method: POST Request URL: http://localhost:8001/admin/myapp/customer/add/ Django Version: 3.2.4 Exception Type: IntegrityError Exception Value: duplicate key value violates unique constraint "myapp_customer_user_id_key" DETAIL: Key (user_id)=(1) already exists. Exception Location: /home/donams/suhail/github/temp/test_unique/env/lib/python3.6/site-packages/django/db/backends/utils.py, line 84, in _execute Python Executable: /home/donams/suhail/github/temp/test_unique/env/bin/python Python Version: 3.6.9 Python Path: ['/home/donams/suhail/github/temp/test_unique', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/donams/suhail/github/temp/test_unique/env/lib/python3.6/site-packages'] Server time: Mon, 21 Jun 2021 11:22:55 +0000
Note:
See TracTickets
for help on using tickets.
Thanks for the report, however, it works for me. Django drops a unique constraint when altering
OneToOneFieldto theForeignKey, e.g.$ python manage.py sqlmigrate test_32869 0002 BEGIN; -- -- Alter field user on customer -- SET CONSTRAINTS "test_32869_customer_user_id_794e3015_fk_auth_user_id" IMMEDIATE; ALTER TABLE "test_32869_customer" DROP CONSTRAINT "test_32869_customer_user_id_794e3015_fk_auth_user_id"; ALTER TABLE "test_32869_customer" DROP CONSTRAINT "test_32869_customer_user_id_key"; CREATE INDEX "test_32869_customer_user_id_794e3015" ON "test_32869_customer" ("user_id"); ALTER TABLE "test_32869_customer" ADD CONSTRAINT "test_32869_customer_user_id_794e3015_fk_auth_user_id" FOREIGN KEY ("user_id") REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED; COMMIT;(I used
test_32869instead ofmyapp.)