#30721: Implicit related objects filtration because of the set Manager.
-----------------------------------------+------------------------
               Reporter:  ApaDoctor      |          Owner:  nobody
                   Type:  Bug            |         Status:  new
              Component:  Uncategorized  |        Version:  2.2
               Severity:  Normal         |       Keywords:
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  0              |
-----------------------------------------+------------------------
 When abstract model is defined with `objects` manager.
 And its child-model defines another manager - RelatedManager uses defined
 manager instead of objects.

 {{{#!python
 class SomeAbstractModel(models.Model):
     class Meta:
         abstract = True

     objects = models.Manager()


 class CustomManager(models.Manager):
     def get_queryset(self):
         return super().get_queryset().filter(some_field=True)


 class SomeThing(SomeAbstractModel):
     some_field = models.BooleanField()

     parent = models.ForeignKey(
         "SomeThing", related_name="children", on_delete=models.SET_NULL,
 null=True
     )

     custom_objects = CustomManager()
 }}}

 So we have abstract model, which defines `objects` manager for the model.

 Our model uses that abstract class.

 I created some objects:
 {{{#!python
 SomeThing(some_field=True).save()
 SomeThing.objects.bulk_create([SomeThing(some_field=bool(x%2),
 parent_id=1) for x in range(0,6)])
 }}}

 After i reloaded shell i tried to make queries:
 {{{#!python
 >>> x = SomeThing.objects.get(id=1)
 >>> x.children.count()
 3
 >>>SomeThing.objects.filter(parent_id=1).count()
 6
 }}}

 Generated raw SQL for first query is:

 {{{#!sql
 SELECT COUNT(*) AS "__count" FROM "sapp_something" WHERE
 ("sapp_something"."some_field" = true AND "some_something"."parent_id" =
 1)
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30721>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.79589af8490c3aeab7c3052e2f7e39b5%40djangoproject.com.

Reply via email to