diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-04-26 13:48:31 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-04-26 13:48:31 +0000 |
| commit | 6c18ba8c910451a1c579a6a62a46d63be2b4e8af (patch) | |
| tree | 9f20d3de3bf9c02d84f2b456f987b97189b15ab8 | |
| parent | 439cb4047fb583d08149f28e2ce66a8edfe0efa7 (diff) | |
Fixed #1576 -- Fixed incorrect SQL generated when using descending ordering
from related models. Patch from SmileyChris.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@5092 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/contrib/admin/views/main.py | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index 5edc1fc19d..a2c1e741a8 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -707,6 +707,7 @@ class ChangeList(object): # If the order-by field is a field with a relationship, order by the # value in the related table. lookup_order_field = self.order_field + order_type = self.order_type == 'desc' and '-' or '' try: f = self.lookup_opts.get_field(self.order_field, many_to_many=False) except models.FieldDoesNotExist: @@ -717,10 +718,18 @@ class ChangeList(object): pass elif isinstance(f.rel, models.ManyToOneRel): rel_ordering = f.rel.to._meta.ordering and f.rel.to._meta.ordering[0] or f.rel.to._meta.pk.column + if rel_ordering[0] == '-': + rel_ordering = rel_ordering[1:] + order_type = not order_type and '-' or '' lookup_order_field = '%s.%s' % (f.rel.to._meta.db_table, rel_ordering) + # Must select related because the lookup field may be in a + # table not otherwise referenced yet. + # FIXME: Try to remove the need for this in the QuerySet + # refactor. + qs = qs.select_related() # Set ordering. - qs = qs.order_by((self.order_type == 'desc' and '-' or '') + lookup_order_field) + qs = qs.order_by('%s%s' % (order_type, lookup_order_field)) # Apply keyword searches. def construct_search(field_name): |
