Code

Ticket #2884: get_query_set.patch

File get_query_set.patch, 2.1 KB (added by bangcok_dangerus ( at ] hotmail.com, 8 years ago)

fixes the issue, could do with more testing

  • django/contrib/admin/views/main.py

     
    669669        return order_field, order_type 
    670670 
    671671    def get_query_set(self): 
     672        def follow_fkey_ordering(field, fields_seen = None): 
     673            fields_seen = fields_seen or [] 
     674            related_object = field.rel.to 
     675            ordering = related_object._meta.ordering 
     676            if ordering: 
     677                ordering_field = related_object._meta.get_field(ordering[0]) 
     678                if isinstance(ordering_field.rel, models.ManyToOneRel) and not (field in fields_seen): 
     679                    fields_seen.append(field) 
     680                    rel_table, rel_ordering = follow_fkey_ordering(ordering_field, fields_seen) 
     681                else: 
     682                    rel_ordering = ordering_field.column 
     683                    rel_table = related_object._meta.db_table 
     684            else: 
     685                rel_ordering = related_object._meta.pk.column 
     686                rel_table = related_object._meta.db_table 
     687            return rel_table, rel_ordering 
     688 
    672689        qs = self.manager.get_query_set() 
    673690        lookup_params = self.params.copy() # a dictionary of the query string 
    674691        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR): 
     
    706723                # For OneToOneFields, don't try to order by the related object's ordering criteria. 
    707724                pass 
    708725            elif isinstance(f.rel, models.ManyToOneRel): 
    709                 rel_ordering = f.rel.to._meta.ordering and f.rel.to._meta.ordering[0] or f.rel.to._meta.pk.column 
    710                 lookup_order_field = '%s.%s' % (f.rel.to._meta.db_table, rel_ordering) 
     726                #Recursively follows ForeignKey fields to get the correct table name and field for order_by. 
     727                ordering_table, ordering_field = follow_fkey_ordering(f) 
     728                lookup_order_field = '%s.%s' % (ordering_table, ordering_field) 
    711729 
    712730        # Set ordering. 
    713731        qs = qs.order_by((self.order_type == 'desc' and '-' or '') + lookup_order_field)