mirror of
				https://github.com/django/django.git
				synced 2025-10-26 23:26:08 +00:00 
			
		
		
		
	[1.8.x] Fixed #24893 -- Fixed lack of unique constraint when changing a field from primary_key=True to unique=True
Backport of e1e6399c2c from master
			
			
This commit is contained in:
		| @@ -659,7 +659,9 @@ class BaseDatabaseSchemaEditor(object): | |||||||
|             for sql, params in post_actions: |             for sql, params in post_actions: | ||||||
|                 self.execute(sql, params) |                 self.execute(sql, params) | ||||||
|         # Added a unique? |         # Added a unique? | ||||||
|         if not old_field.unique and new_field.unique: |         if (not old_field.unique and new_field.unique) or ( | ||||||
|  |             old_field.primary_key and not new_field.primary_key and new_field.unique | ||||||
|  |         ): | ||||||
|             self.execute(self._create_unique_sql(model, [new_field.column])) |             self.execute(self._create_unique_sql(model, [new_field.column])) | ||||||
|         # Added an index? |         # Added an index? | ||||||
|         if (not old_field.db_index and new_field.db_index and |         if (not old_field.db_index and new_field.db_index and | ||||||
|   | |||||||
| @@ -34,3 +34,6 @@ Bugfixes | |||||||
|  |  | ||||||
| * Fixed quoting of SQL when renaming a field to ``AutoField`` in PostgreSQL | * Fixed quoting of SQL when renaming a field to ``AutoField`` in PostgreSQL | ||||||
|   (:ticket:`24892`). |   (:ticket:`24892`). | ||||||
|  |  | ||||||
|  | * Fixed lack of unique constraint when changing a field from | ||||||
|  |   ``primary_key=True`` to ``unique=True`` (:ticket:`24893`). | ||||||
|   | |||||||
| @@ -82,6 +82,7 @@ class BookWithSlug(models.Model): | |||||||
|  |  | ||||||
| class IntegerPK(models.Model): | class IntegerPK(models.Model): | ||||||
|     i = models.IntegerField(primary_key=True) |     i = models.IntegerField(primary_key=True) | ||||||
|  |     j = models.IntegerField(unique=True) | ||||||
|  |  | ||||||
|     class Meta: |     class Meta: | ||||||
|         apps = new_apps |         apps = new_apps | ||||||
|   | |||||||
| @@ -745,6 +745,45 @@ class SchemaTests(TransactionTestCase): | |||||||
|         with connection.schema_editor() as editor: |         with connection.schema_editor() as editor: | ||||||
|             editor.alter_field(IntegerPK, old_field, new_field, strict=True) |             editor.alter_field(IntegerPK, old_field, new_field, strict=True) | ||||||
|  |  | ||||||
|  |     def test_alter_int_pk_to_int_unique(self): | ||||||
|  |         """ | ||||||
|  |         Should be able to rename an IntegerField(primary_key=True) to | ||||||
|  |         IntegerField(unique=True). | ||||||
|  |         """ | ||||||
|  |         class IntegerUnique(Model): | ||||||
|  |             i = IntegerField(unique=True) | ||||||
|  |             j = IntegerField(primary_key=True) | ||||||
|  |  | ||||||
|  |             class Meta: | ||||||
|  |                 app_label = 'schema' | ||||||
|  |                 apps = new_apps | ||||||
|  |                 db_table = 'INTEGERPK' | ||||||
|  |  | ||||||
|  |         with connection.schema_editor() as editor: | ||||||
|  |             editor.create_model(IntegerPK) | ||||||
|  |  | ||||||
|  |         # model requires a new PK | ||||||
|  |         old_field = IntegerPK._meta.get_field('j') | ||||||
|  |         new_field = IntegerField(primary_key=True) | ||||||
|  |         new_field.model = IntegerPK | ||||||
|  |         new_field.set_attributes_from_name('j') | ||||||
|  |  | ||||||
|  |         with connection.schema_editor() as editor: | ||||||
|  |             editor.alter_field(IntegerPK, old_field, new_field, strict=True) | ||||||
|  |  | ||||||
|  |         old_field = IntegerPK._meta.get_field('i') | ||||||
|  |         new_field = IntegerField(unique=True) | ||||||
|  |         new_field.model = IntegerPK | ||||||
|  |         new_field.set_attributes_from_name('i') | ||||||
|  |  | ||||||
|  |         with connection.schema_editor() as editor: | ||||||
|  |             editor.alter_field(IntegerPK, old_field, new_field, strict=True) | ||||||
|  |  | ||||||
|  |         # Ensure unique constraint works. | ||||||
|  |         IntegerUnique.objects.create(i=1, j=1) | ||||||
|  |         with self.assertRaises(IntegrityError): | ||||||
|  |             IntegerUnique.objects.create(i=1, j=2) | ||||||
|  |  | ||||||
|     def test_rename(self): |     def test_rename(self): | ||||||
|         """ |         """ | ||||||
|         Tests simple altering of fields |         Tests simple altering of fields | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user