#24748 closed Bug (fixed)
GROUP BY clause incorrect with foreign key to self in MySQL
Reported by: | Ben Buchwald | Owned by: | Anssi Kääriäinen |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.8 |
Severity: | Release blocker | Keywords: | annotate mysql |
Cc: | josh.smeaton@… | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
A query I had that previously worked in Django 1.7 is quite broken in 1.8. When annotating a query of a model that has a a foreign key to itself, the wrong field is grouped by. This only occurs in MySQL due a bug to the group by primary key optimization.
Using this example model:
class Item(Model): name = CharField(max_length=50) parent = ForeignKey('self',null=True,blank=True,related_name='children')
I used to be able to get a list of items with their number of children like this:
Item.objects.all().annotate(num_children=Count('children'))
But in Django 1.8, this groups by parent_id instead of by id. This is because both are selected, and the output field for both are the same, the primary key of Item.
Change History (6)
comment:1 by , 10 years ago
Cc: | added |
---|---|
Severity: | Normal → Release blocker |
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 10 years ago
I think this commit isn't part of 1.8 and it shouldn't affect the MySQL backend since it has connection.features.allows_group_by_pk = True
anyway.
I remember commenting about a possible issue with the existing logic however. I'm just curious about which change introduced the regression since it looks like it was always broken to me.
comment:3 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
I think I can take blame for this one. I'll try to work on this today.
comment:4 by , 10 years ago
Has patch: | set |
---|---|
Triage Stage: | Accepted → Ready for checkin |
Just a guess since I haven't tested yet, but perhaps commit dc27f3ee0c3eb9bb17d6cb764788eeaf73a371d7 is a good place to start looking for the regression.