mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #9308 -- Corrected the updated of nullable foreign key fields when deleting objects. Thanks to Bob Thomas for the fix, and markshep for the improvements on the test case.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10822 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -1007,7 +1007,7 @@ def delete_objects(seen_objs): | |||||||
|             update_query = sql.UpdateQuery(cls, connection) |             update_query = sql.UpdateQuery(cls, connection) | ||||||
|             for field, model in cls._meta.get_fields_with_model(): |             for field, model in cls._meta.get_fields_with_model(): | ||||||
|                 if (field.rel and field.null and field.rel.to in seen_objs and |                 if (field.rel and field.null and field.rel.to in seen_objs and | ||||||
|                         filter(lambda f: f.column == field.column, |                         filter(lambda f: f.column == field.rel.get_related_field().column, | ||||||
|                         field.rel.to._meta.fields)): |                         field.rel.to._meta.fields)): | ||||||
|                     if model: |                     if model: | ||||||
|                         sql.UpdateQuery(model, connection).clear_related(field, |                         sql.UpdateQuery(model, connection).clear_related(field, | ||||||
|   | |||||||
| @@ -168,7 +168,16 @@ True | |||||||
| >>> o.keys() | >>> o.keys() | ||||||
| [<class 'modeltests.delete.models.F'>, <class 'modeltests.delete.models.E'>] | [<class 'modeltests.delete.models.F'>, <class 'modeltests.delete.models.E'>] | ||||||
|  |  | ||||||
|  | # temporarily replace the UpdateQuery class to verify that E.f is actually nulled out first | ||||||
|  | >>> import django.db.models.sql | ||||||
|  | >>> class LoggingUpdateQuery(django.db.models.sql.UpdateQuery): | ||||||
|  | ...     def clear_related(self, related_field, pk_list): | ||||||
|  | ...         print "CLEARING FIELD",related_field.name | ||||||
|  | ...         return super(LoggingUpdateQuery, self).clear_related(related_field, pk_list) | ||||||
|  | >>> original_class = django.db.models.sql.UpdateQuery | ||||||
|  | >>> django.db.models.sql.UpdateQuery = LoggingUpdateQuery | ||||||
| >>> e1.delete() | >>> e1.delete() | ||||||
|  | CLEARING FIELD f | ||||||
|  |  | ||||||
| >>> e2 = E() | >>> e2 = E() | ||||||
| >>> e2.save() | >>> e2.save() | ||||||
| @@ -185,6 +194,9 @@ True | |||||||
| [<class 'modeltests.delete.models.F'>, <class 'modeltests.delete.models.E'>] | [<class 'modeltests.delete.models.F'>, <class 'modeltests.delete.models.E'>] | ||||||
|  |  | ||||||
| >>> f2.delete() | >>> f2.delete() | ||||||
|  | CLEARING FIELD f | ||||||
|  |  | ||||||
|  | # Put this back to normal | ||||||
|  | >>> django.db.models.sql.UpdateQuery = original_class | ||||||
| """ | """ | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user