Opened 13 years ago
Closed 9 years ago
#18142 closed Bug (wontfix)
sorting in change_list is not distincted
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | contrib.admin | Version: | 1.4 |
Severity: | Normal | Keywords: | sort distinct |
Cc: | tomek@… | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
class Appointment(models.Model): link = models.ForeignKey(MainData) date = models.DateField() class MainData(models.Model): def filteredAppointment1(self): return Appointment.objects.filter().latest('date') #my special filter1 filteredAppointment1.admin_order_field = 'appointment__date' def filteredAppointment2(self): return Appointment.objects.filter().latest('date') #my special filter2 filteredAppointment2.admin_order_field = 'appointment__date'
After sortig it in admin change_list it ends up as a
Cartesian product of [filteredAppointment1 x filteredAppointment2]. Which means: NOT distincted.
Change History (5)
comment:1 by , 12 years ago
Component: | Database layer (models, ORM) → contrib.admin |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
comment:2 by , 11 years ago
Consider following:
# models.py class Case(models.Model): name = models.CharField(max_length=100) class Appointment(models.Model): case = models.ForeignKey(Case, related_name='appointments') date = models.DateTimeField(default=timezone.now) # console >>> print Case.objects.order_by('appointments__date').distinct().query SELECT DISTINCT "a_case"."id", "a_case"."name", "a_appointment"."date" FROM "a_case" LEFT OUTER JOIN "a_appointment" ON ( "a_case"."id" = "a_appointment"."case_id" ) ORDER BY "a_appointment"."date" ASC
Distinct does not really work in this case, because order_by needs to pull one-to-many field into select clause, rows thus are unique and "non-distinctable".
I'm don't know what to do here. I'm not really sure if it's a real bug.
comment:3 by , 11 years ago
Cc: | added |
---|
comment:4 by , 11 years ago
I think ordering by one-to-many join is a bug in itself. It is useful if you happen to know that you have constrained the one-to-many to unique field somehow (I believe this should work: .filter(translations__lang='fi').order_by('translations__name')
). But if you have this data:
a1 -> b1 (col=1) -> b2 (col=4) a2 -> b3 (col=2) -> b4 (col=3)
there isn't anything sane the ORM (or the admin) can do for A.objects.order_by(b__col)
. The ordering for distinct objects simply isn't defined.
So, I don't think we can remove the ability to order_by one-to-many as the user might have restricted the many side to unique object, but on the other hand we can't actually do anything sane for one-to-many ordering if there are actually many objects on the many side.
Maybe we can find a better way for this special one-to-many restricted to one-to-one ordering case. Until that day this ticket seems impossible to solve.
comment:5 by , 9 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Closing as "wontfix" given no consensus about how to move the ticket forward.
Related to #13902 - probably just needs the code that detects distinct-setting updated.