I have isolated this behaviour on a simple project:
{{{
#!div style="font-size: 80%"
models.py:
{{{#!python
from django.db import models
class ChildModel(models.Model):
name = models.CharField(max_length=200)
class ParentModel(models.Model):
name = models.CharField(max_length=200)
child_1 = models.ForeignKey(ChildModel, on_delete=models.SET_NULL,
related_name='parents_1', null=True)
child_2 = models.ForeignKey(ChildModel, on_delete=models.SET_NULL,
related_name='parents_2', null=True)
}}}
Django shell session:
{{{#!python
from testapp.models import ParentModel, ChildModel
child_1 = ChildModel.objects.create(name="child_1")
child_2 = ChildModel.objects.create(name="child_2")
parent_1 = ParentModel.objects.create(name="parent 1", child_1=child_1,
child_2=child_2)
parent_2 = ParentModel.objects.create(name="parent 2", child_1=child_2,
child_2=child_1)
child_1.delete()
parent_1 = ParentModel.objects.get(pk=parent_1.pk)
parent_2 = ParentModel.objects.get(pk=parent_2.pk)
# parent_1.child_2 and parent_2.child_1 should be normaly equal to child_2
but...
parent_1.child_2 is not None and parent_2.child_1 is not None
# False is returned
}}}
}}}
This simple project has been tested on an SQLite database. The same
behaviour has been first discovered on a PostgreSQL database.
A mis-reuse of an UpdateQuery seems to be the cause of this bug.
The attached patch fixes the issue.
After search on the django bug tracker I have found another issue with the
same patch attached #28099.
I have opened this new ticket because the issue seems to be more severe (I
have experienced large data loss) and more general.
This issue has been found on version 1.11 and 2.0 of Django.
--
Ticket URL: <https://code.djangoproject.com/ticket/29016>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* Attachment "fix_delete_on_update.patch" added.
Simple patch version (no regression test yet)
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:1>
* has_patch: 0 => 1
Old description:
New description:
After search on the django bug tracker I have found another issue with the
same patch attached #28099.
I have opened this new ticket because the issue seems to be more severe (I
have experienced large data loss) and more general.
This issue has been found on version 1.11 and 2.0 of Django.
I have created a new branch on my github account with patch and test
associated: https://github.com/Nimn/django/tree/ticket_29016
--
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:2>
* severity: Normal => Release blocker
* stage: Unreviewed => Accepted
Comment:
I think that qualifies for a backport based on the "data loss" criteria.
Rather than adding entirely new models, can you reuse an existing model
(perhaps another `ForeignKey` will need to be added on an existing model)
either in `delete` or `delete_regress`?
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:3>
* owner: nobody => Étienne Loks
* status: new => assigned
Comment:
I have changed a model in `delete_regress` to add two foreign keys (it
seems clearer to me). I have sent a pull request for the master branch.
If it really qualifies to a backport (I agree with this qualification),
how can I proceed to propose a patch? I miss a proper documentation.
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:4>
* stage: Accepted => Ready for checkin
Comment:
Looks good, I made some cosmetic edits and added release notes.
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:5>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"9a621edf624a4eb1f1645fca628a9e432f0de776" 9a621edf]:
{{{
#!CommitTicketReference repository=""
revision="9a621edf624a4eb1f1645fca628a9e432f0de776"
Fixed #29016 -- Fixed incorrect foreign key nullification on related
instance deletion.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:6>
Comment (by Tim Graham <timograham@…>):
In [changeset:"8f2e3857ce5a50839ee362690a6a6d92fc8ff0ea" 8f2e3857]:
{{{
#!CommitTicketReference repository=""
revision="8f2e3857ce5a50839ee362690a6a6d92fc8ff0ea"
[2.0.x] Fixed #29016 -- Fixed incorrect foreign key nullification on
related instance deletion.
Backport of 9a621edf624a4eb1f1645fca628a9e432f0de776 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:7>
Comment (by Tim Graham <timograham@…>):
In [changeset:"419705bbe84e27c3d5be85f198a0352a6724927e" 419705bb]:
{{{
#!CommitTicketReference repository=""
revision="419705bbe84e27c3d5be85f198a0352a6724927e"
[1.11.x] Fixed #29016 -- Fixed incorrect foreign key nullification on
related instance deletion.
Backport of 9a621edf624a4eb1f1645fca628a9e432f0de776 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29016#comment:8>