diff --git a/django/db/models/query.py b/django/db/models/query.py index 2e02f3f4978..6a8d7d5e64c 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -615,7 +615,7 @@ class QuerySet(object): clone = self._clone() clone.query.add_immediate_loading(fields) return clone - + ################################### # PUBLIC INTROSPECTION ATTRIBUTES # ################################### @@ -632,7 +632,7 @@ class QuerySet(object): else: return False ordered = property(ordered) - + ################### # PRIVATE METHODS # ################### @@ -1007,7 +1007,7 @@ def delete_objects(seen_objs): update_query = sql.UpdateQuery(cls, connection) for field, model in cls._meta.get_fields_with_model(): 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)): if model: sql.UpdateQuery(model, connection).clear_related(field, diff --git a/tests/modeltests/delete/models.py b/tests/modeltests/delete/models.py index 49aab1fb1bc..58b296d8d29 100644 --- a/tests/modeltests/delete/models.py +++ b/tests/modeltests/delete/models.py @@ -30,7 +30,7 @@ class D(DefaultRepr, models.Model): # D -> A # So, we must delete Ds first of all, then Cs then Bs then As. -# However, if we start at As, we might find Bs first (in which +# However, if we start at As, we might find Bs first (in which # case things will be nice), or find Ds first. # Some mutually dependent models, but nullable @@ -96,7 +96,7 @@ CyclicDependency: There is a cyclic dependency of items to be processed. >>> def clear_rel_obj_caches(models): ... for m in models: -... if hasattr(m._meta, '_related_objects_cache'): +... if hasattr(m._meta, '_related_objects_cache'): ... del m._meta._related_objects_cache # Nice order @@ -168,7 +168,16 @@ True >>> o.keys() [, ] +# 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() +CLEARING FIELD f >>> e2 = E() >>> e2.save() @@ -185,6 +194,9 @@ True [, ] >>> f2.delete() +CLEARING FIELD f +# Put this back to normal +>>> django.db.models.sql.UpdateQuery = original_class """ }