#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 django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.79589af8490c3aeab7c3052e2f7e39b5%40djangoproject.com.

Reply via email to