Following up on #17338 ([nonrel] supports_deleting_related_objects database feature flag):
carljm said that: > [Django] is (sort of) _emulating_ SQL cascading deletes, but it does so in a > way that doesn't assume anything at all from the backend. I'm not sure this is correct. If I define the following models: from django.db import models class Person(models.Model): name = models.CharField(max_length=100) class Car(models.Model): name = models.CharField(max_length=100) owner = models.ForeignKey(Person) Related objects are indeed deleted on a sqlite Django project: In [1]: from vortaro.models import Person, Car In [2]: p = Person.objects.create(name='bob') In [3]: c = Car.objects.create(name='robin reliant', owner=p) In [4]: p.delete() In [5]: Car.objects.all() Out[5]: [] In [6]: from django.db import connection In [7]: connection.queries Out[7]: [{'sql': u'INSERT INTO "vortaro_person" ("name") VALUES (bob)', 'time': '0.001'}, {'sql': u'INSERT INTO "vortaro_car" ("name", "owner_id") VALUES (robin reliant, 1)', 'time': '0.001'}, {'sql': u'SELECT "vortaro_car"."id", "vortaro_car"."name", "vortaro_car"."owner_id" FROM "vortaro_car" WHERE "vortaro_car"."owner_id" IN (1)', 'time': '0.001'}, {'sql': u'DELETE FROM "vortaro_car" WHERE "id" IN (1)', 'time': '0.000'}, {'sql': u'DELETE FROM "vortaro_person" WHERE "id" IN (1)', 'time': '0.000'}, {'sql': u'SELECT "vortaro_car"."id", "vortaro_car"."name", "vortaro_car"."owner_id" FROM "vortaro_car" LIMIT 21', 'time': '0.000'}] This isn't making a second query to deleting the Car model, it is depending on the database to do this. For comparison, here's the same on App Engine: In [1]: from test_app.models import Person, Car In [2]: p = Person.objects.create(name='bob') In [3]: c = Car.objects.create(name='robin reliant', owner=p) In [4]: p.delete() In [5]: Car.objects.all() Out[5]: [<Car: Car object>] In [6]: c = Car.objects.get() In [7]: c.owner --------------------------------------------------------------------------- DoesNotExist Traceback (most recent call last) /home/wilfred/bleeding_edge/django-testapp/<ipython-input-7- f94c13ea1b0a> in <module>() ----> 1 c.owner /home/wilfred/bleeding_edge/django-testapp/django/db/models/fields/ related.pyc in __get__(self, instance, instance_type) 313 rel_obj = rel_mgr.using(db).get(**params) 314 else: --> 315 rel_obj = QuerySet(self.field.rel.to).using(db).get(**params) 316 setattr(instance, cache_name, rel_obj) 317 return rel_obj /home/wilfred/bleeding_edge/django-testapp/django/db/models/query.pyc in get(self, *args, **kwargs) 349 if not num: 350 raise self.model.DoesNotExist("%s matching query does not exist." --> 351 % self.model._meta.object_name) 352 raise self.model.MultipleObjectsReturned("get() returned more than one %s -- it returned %s! Lookup parameters were %s" 353 % (self.model._meta.object_name, num, kwargs)) DoesNotExist: Person matching query does not exist. Have I horribly misunderstood? Wilfred -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.