#29230 closed Bug (fixed)
Incorrect behavior of QuerySet.prefetch_related() in some circumstances during multilevel data prefetching
| Reported by: | Alex Sichkar | Owned by: | Paulo |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.11 |
| Severity: | Normal | Keywords: | prefetch_related |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
In some circumstances prefetched data might be overwritten.
IMHO this ticket is related to the issue:
https://code.djangoproject.com/ticket/24873
If I revert changes from this pull request:
https://github.com/django/django/pull/4723
there is no such problem.
Prepared sample project with test case to reproduce the issue.
Attachments (1)
Change History (6)
by , 8 years ago
| Attachment: | prefetch_related_issue.zip added |
|---|
comment:1 by , 8 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 7 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 7 years ago
PR: https://github.com/django/django/pull/9995
The commit in https://code.djangoproject.com/changeset/379caf397ea41923278821085204c296f960e70e/ didn't fix this.
It just reversed the execution order of prefetch objects.
Changing the attached test from:
projects = Project.objects.prefetch_related(
Prefetch('tasks', queryset=tasks),
Prefetch('tasks', to_attr='some_attr_name'),
)
to:
projects = Project.objects.prefetch_related(
Prefetch('tasks', to_attr='some_attr_name'),
Prefetch('tasks', queryset=tasks),
)
Made it fail again.
I found that your test case was fixed in Django 2.0 by 379caf397ea41923278821085204c296f960e70e. Since a regression test wasn't added as part of that commit, I'll accept the ticket to do that. If you can adapt your test for
tests/prefetch_related(using existing models as much as possible) that would be great.