django cascading delete on models foreign keys default. is, have foreignkey in pointing b, , delete b, deleted well.
this known , documented, haven't found rationale design decision around making default, given how unintuitive seems. know why may case?
7 years ago...
a ticket open #7539
where began discussed.
years ago benjaoming
someone requested discussion... had encounter this, , lacked knowing what's going on regards cascading deletion, because it's quite dangerous (you loose data!!) , steals lots of time. preventing simple, though. overriding delete() method of model , calling clear() on related model's foreign keys simple, , it's manual implementation, programmers should able understand. can think of alternative: if null=true foreign key in question, why not automatically use set null when related instance deleted? me, more "intuitive" cascade. after all, null=true programmer specifies , has deal anywhere in implementation, why doesn't need cascading deletion of such relation. also, if on_delete possible set in key field, have comply null option.. , "intuition argument" creates 1:1 correspondence between 2 options. , "logic argument": django handles logic in python code, not in database, kept simple storage engine. restrict option validation issue, , handled way in cases, having database enforcing it, redundant. enable on model-level pave way nice new automatic validation in modelforms, think sounds nice feature. if implemented, suggest remove null option key fields , have set according on_delete.
years later, matter again discussed in group.
django developers (contributions django itself)
changing on_delete=cascade default
and other tickets created #21127 , #21961.
and got here. foreignkey , onetoonefield on_delete argument
in order increase awareness cascading model deletion, on_delete argument of foreignkey , onetoonefield required in django 2.0.
update models , existing migrations explicitly set argument. since default models.cascade, add on_delete=models.cascade foreignkey , onetoonefields don’t use different option. can pass second positional argument if don’t care compatibility older versions of django.
Comments
Post a Comment