#31614 closed Bug (fixed)
order_by() with expressions crashes on union() querysets.
Reported by: | Laurent Tramoy | Owned by: | Laurent Tramoy |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | 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 (last modified by )
I have read the recent tickets about unions and order_by (#31496, #27995, #30628) , and my bug is slightly different, so I hope it's not a duplicate.
Let's consider two similar models:
class EntityA(models.Model): name_a = models.CharField(max_length=128, null=True) dt_a = models.DateTimeField(null=True) class EntityB(models.Model): name_b = models.CharField(max_length=128, null=True) dt_b = models.DateTimeField(null=True) EntityA.objects.create(name_a="a") EntityA.objects.create(name_a="qwerty", dt_a=timezone.now()) EntityB.objects.create(name_b="random", dt_b=timezone.now()) EntityB.objects.create(name_b="b") qs_a = EntityA.objects.values(name=F("name_a"), dt=F("dt_a")) qs_b = EntityB.objects.values(name=F("name_b"), dt=F("dt_b")) # union queryset queryset = qs_a.union(qs_b)
I can use a simple ORDER BY clause:
queryset.order_by("-dt")
And everything will work, no problem here.
What I actually want is the same query, but with a NULLS LAST
Usually the query becomes:
queryset.order_by(F("dt").desc(nulls_last=True))
but that raises a
DatabaseError: ORDER BY term does not match any column in the result set.
I know unions can handle only a few clauses, but ORDER BY is one of them, so I'm unsure whether this is the expected behaviour or not.
If it's expected, then the raised exception could be more explicit.
Change History (9)
follow-up: 2 comment:1 by , 4 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|---|
Description: | modified (diff) |
Summary: | Add a NULLS FIRST / LAST clause while ordering a union → order_by() with expressions crashes on union() querysets. |
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
comment:2 by , 4 years ago
Replying to felixxm:
Thanks, yes it is a different issue that is strictly related with using expressions in
.order_by()
. Potential fix should target these lines. Would you like to try?
Ok I'll give it a try this week end, I just need to read django conventions before, as I've never committed on this project
comment:3 by , 4 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:5 by , 4 years ago
Triage Stage: | Accepted → Ready for checkin |
---|
Thanks, yes it is a different issue that is strictly related with using expressions in
.order_by()
. Potential fix should target these lines. Would you like to try?