Opened 12 years ago

Closed 8 years ago

Last modified 8 years ago

#19222 closed Cleanup/optimization (fixed)

Clarify that custom managers don't apply to intermediate joins

Reported by: Andrew Badr Owned by: Yanik Koval
Component: Documentation Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Loic Bistuer)

I have a custom Manager to filter out model instances with where the field deleted is True. I'm using an ORM query that looks like user1.page_set.filter(membership__user=user2).

My expectation is that Membership objects with the deleted flag set are not included in the query. Instead, they are being included.

Change History (16)

comment:1 by Matt Austin, 11 years ago

Resolution: needsinfo
Status: newclosed
Type: UncategorizedBug

Attempted to reproduce this, but require more info on model relationships.

comment:2 by jedediah, 10 years ago

class BagelManager(Manager):
    use_for_related_fields = True

    def get_query_set(self):
        return super(BagelManager, self).get_query_set().filter(deleted=False)

class Bagel(Model):
    deleted = BooleanField()

    objects = BagelManager()
    all_bagels = Manager()

    def __str__(self):
        return "deleted" if self.deleted else "active"

class Customer(Model):
    bagels = ManyToManyField(Bagel)
>>> Bagel.objects.create(deleted=False)
<Bagel: active>
>>> Bagel.objects.create(deleted=True)
<Bagel: deleted>
>>> Bagel.all_bagels.all()
[<Bagel: active>, <Bagel: deleted>]
>>> Bagel.objects.all()
[<Bagel: active>]
>>> Bagel.objects.filter(deleted=True)
[]

Correct so far... deleted bagel is invisible through default manager

>>> c = Customer.objects.create()
>>> c.bagels.add(*Bagel.all_bagels.all())
>>> c.bagels.all()
[<Bagel: active>]
>>> c.bagels.filter(deleted=True)
[]

Still good... deleted bagel is invisible to related fields

>>> Customer.objects.filter(bagels__deleted=True)
[<Customer: Customer object>]

Here's the problem. The query join sees the deleted bagel. I would expect queries through relations to see the same data as the relations themselves.

This should either be fixed or documented as a known limitation.

comment:3 by jedediah, 10 years ago

Resolution: needsinfo
Status: closednew

comment:4 by Tim Graham, 10 years ago

Triage Stage: UnreviewedAccepted
Type: BugCleanup/optimization

I don't think this a behavior that's going to change, so documentation seems like the way to go. If you'd like to write a patch, I'll be happy to review it.

comment:5 by Tim Graham, 8 years ago

Keywords: use_for_related_fields added

comment:6 by Loic Bistuer, 8 years ago

Description: modified (diff)
Keywords: use_for_related_fields removed
Summary: Documentation for use_for_related_fields should clarify that it doesn't work for intermediate joinsClarify that custom managers don't apply to intermediate joins
Version: 1.4master

comment:7 by Holly Becker, 8 years ago

Easy pickings: set
Needs documentation: set
Owner: changed from nobody to Holly Becker
Status: newassigned

comment:8 by Tim Graham, 8 years ago

Has patch: set
Needs documentation: unset
Patch needs improvement: set

PR with comments for improvement.

comment:9 by Holly Becker, 8 years ago

Owner: Holly Becker removed
Status: assignednew

comment:10 by Tim Graham, 8 years ago

Patch needs improvement: unset

comment:11 by Yanik Koval, 8 years ago

Owner: set to Yanik Koval
Status: newassigned

comment:12 by Tim Graham, 8 years ago

yanikkoval, not sure why you assigned yourself to the ticket. In case you didn't see it, we have a patch awaiting review linked in comment:8.

comment:13 by Yanik Koval, 8 years ago

Sorry, didn't notice.

comment:14 by Tim Graham, 8 years ago

Easy pickings: unset

I felt the existing proposal is more verbose than needed, so I created an alternate PR.

comment:15 by GitHub <noreply@…>, 8 years ago

Resolution: fixed
Status: assignedclosed

In 8fb53c50:

Fixed #19222 -- Documented that default managers aren't used for related queries.

comment:16 by Tim Graham <timograham@…>, 8 years ago

In 8df2da3:

[1.10.x] Fixed #19222 -- Documented that default managers aren't used for related queries.

Backport of 8fb53c50ce1c759c740960c9e1cef3cef39cabc5 from master

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