Code

Ticket #7270: django_select_related_onetoone_r7534.2.patch

File django_select_related_onetoone_r7534.2.patch, 2.4 KB (added by towjzhou@…, 6 years ago)

A updated patch to fix this ticket. This patch only work in select(fields...) mode, not effect on select()/select(depth=?) mode.

  • django/db/models/query.py

     
    669669        if cached_row: 
    670670            rel_obj, index_end = cached_row 
    671671            setattr(obj, f.get_cache_name(), rel_obj) 
     672             
     673    if restricted: 
     674        for f in klass._meta.get_all_related_objects(): 
     675            if f.field.related_query_name() not in requested: 
     676                continue 
     677            if restricted: 
     678                next = requested[f.field.related_query_name()] 
     679            else: 
     680                next = None 
     681            cached_row = get_cached_row(f.model, row, index_end, max_depth, cur_depth+1, next) 
     682            if cached_row: 
     683                rel_obj, index_end = cached_row 
     684                if rel_obj.pk: 
     685                    setattr(obj, f.field.get_cache_name(), rel_obj) 
     686                else: 
     687                    setattr(obj, f.field.get_cache_name(), None) 
     688             
    672689    return obj, index_end 
    673690 
    674691def delete_objects(seen_objs): 
  • django/db/models/sql/query.py

     
    907907                next = False 
    908908            self.fill_related_selections(f.rel.to._meta, alias, cur_depth + 1, 
    909909                    used, next, restricted) 
     910         
     911        if restricted: 
     912            for f in opts.get_all_related_objects(): 
     913                if f.field.related_query_name() not in requested: 
     914                    continue 
     915                table = f.model._meta.db_table 
     916                alias = root_alias 
     917                alias = self.join((alias, table, 'id', f.field.column), exclusions=used, promote=True) 
     918                used.add(alias) 
     919                self.related_select_cols.extend([(alias, f2.column) for f2 in f.model._meta.fields]) 
     920                self.related_select_fields.extend(f.model._meta.fields) 
     921                if restricted: 
     922                    next = requested.get(f.name, {}) 
     923                else: 
     924                    next = False 
     925                self.fill_related_selections(f.model._meta, alias, cur_depth + 1, used, next, restricted) 
    910926 
    911927    def add_filter(self, filter_expr, connector=AND, negate=False, trim=False, 
    912928            can_reuse=None):