Opened 4 years ago

Closed 4 years ago

#32869 closed Bug (worksforme)

Bug while migrating a OneToOneField to ForeignKey on PostgreSQL.

Reported by: suhailvs 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

Change History (1)

comment:1 by Mariusz Felisiak, 4 years ago

Resolution: worksforme
Status: newclosed

Thanks for the report, however, it works for me. Django drops a unique constraint when altering OneToOneField to the ForeignKey, 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_32869 instead of myapp.)

Note: See TracTickets for help on using tickets.
Back to Top