Opened 6 years ago

Closed 6 years ago

Last modified 6 years ago

#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)

prefetch_related_issue.zip (8.2 KB ) - added by Alex Sichkar 6 years ago.

Download all attachments as: .zip

Change History (6)

by Alex Sichkar, 6 years ago

Attachment: prefetch_related_issue.zip added

comment:1 by Tim Graham, 6 years ago

Triage Stage: UnreviewedAccepted

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.

comment:2 by Paulo, 6 years ago

Owner: changed from nobody to Paulo
Status: newassigned

comment:3 by Paulo, 6 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.

comment:4 by Tim Graham <timograham@…>, 6 years ago

Resolution: fixed
Status: assignedclosed

In 6104875a:

Fixed #29230 -- Fixed nested prefetches that clash with descriptors.

comment:5 by Tim Graham <timograham@…>, 6 years ago

In 25d4d846:

[2.1.x] Fixed #29230 -- Fixed nested prefetches that clash with descriptors.

Backport of 6104875a2cc797bbd1254aa61f22a9b03d652128 from master

Note: See TracTickets for help on using tickets.
Back to Top