#31581: Queryset bug when using Q()? -- doubles up the counts by doing an extra
join
-------------------------------------+-------------------------------------
Reporter: Javier Buzzi | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 3.0
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Javier Buzzi:
Old description:
> I ran this on all the "recent" versions of python and i see the issue on
> all of them. At this point, im not 100% sure if it is a problem or not, i
> ran across this trying to show some counts in the Admin that had some
> search_fields that traversed the model backwards and forwards in order to
> match the thing properly.
>
> This "bug" can be seen from 1.11-3.0. Havent checked 3.1
>
> This is my mocked models of the issue:
>
> {{{
> class ModelA(models.Model):
> somecriteria = models.CharField(max_length=50)
>
> class ModelC(models.Model):
> unimportant = models.CharField(max_length=50)
>
> class ModelB(models.Model):
> somerelation = models.ForeignKey(ModelA, on_delete=models.CASCADE)
> m2m = models.ManyToManyField(
> ModelC,
> through='ModelBC'
> )
>
> class ModelBC(models.Model):
> b = models.ForeignKey(ModelB, on_delete=models.CASCADE)
> c = models.ForeignKey(ModelC, on_delete=models.CASCADE)
> }}}
>
> The "bug" is shown when i do:
>
> {{{
> queryset =
> ModelB.objects.select_related('a').annotate(num_c=Count('m2m__id')).values('num_c')
> queryset = queryset.filter(Q(modelbc__c__unimportant='1') |
> Q(somerelation__somecriteria='1'))
> }}}
>
> When i do:
>
> {{{
> queryset =
> ModelB.objects.select_related('a').annotate(num_c=Count('m2m__id')).values('num_c')
> queryset = queryset.filter(modelbc__c__unimportant='1',
> somerelation__somecriteria='1')
> }}}
>
> it works as expected.
>
> My testing arena can be found here:
> https://gist.github.com/kingbuzzman/9fe5470e31a421aa88b2a64e5447e147 see
> the comments, for the way to run it.
New description:
I ran this on all the "recent" versions of python and i see the issue on
all of them. At this point, im not 100% sure if it is a problem or not, i
ran across this trying to show some counts in the Admin that had some
search_fields that traversed the model backwards and forwards in order to
match the thing properly.
This "bug" can be seen from 1.11-3.0. Haven't checked 3.1 because i cant
find it in pip.
This is my mocked models of the issue:
{{{
class ModelA(models.Model):
somecriteria = models.CharField(max_length=50)
class ModelC(models.Model):
unimportant = models.CharField(max_length=50)
class ModelB(models.Model):
somerelation = models.ForeignKey(ModelA, on_delete=models.CASCADE)
m2m = models.ManyToManyField(
ModelC,
through='ModelBC'
)
class ModelBC(models.Model):
b = models.ForeignKey(ModelB, on_delete=models.CASCADE)
c = models.ForeignKey(ModelC, on_delete=models.CASCADE)
}}}
The "bug" is shown when i do:
{{{
queryset =
ModelB.objects.select_related('a').annotate(num_c=Count('m2m__id')).values('num_c')
queryset = queryset.filter(Q(modelbc__c__unimportant='1') |
Q(somerelation__somecriteria='1'))
}}}
When i do:
{{{
queryset =
ModelB.objects.select_related('a').annotate(num_c=Count('m2m__id')).values('num_c')
queryset = queryset.filter(modelbc__c__unimportant='1',
somerelation__somecriteria='1')
}}}
it works as expected.
My testing arena can be found here:
https://gist.github.com/kingbuzzman/9fe5470e31a421aa88b2a64e5447e147 see
the comments, for the way to run it.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/31581#comment:3>
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/069.1b430260bcc2652644af174a57ffa3e8%40djangoproject.com.