-
Code's Tags
-
Your Codes
-
Reffers
-
Linked Codes
|
Code:
Short link for Twitter:
HTML:
HTML view:
Copy Source | Copy HTML- def load_related_generic(object_list, field='content_object'):
- if not object_list:
- return object_list
- related_field = getattr(object_list.model, field)
- ct_field = object_list.model._meta.get_field(related_field.ct_field).get_attname()
- fk_field = object_list.model._meta.get_field(related_field.fk_field).get_attname()
- result = {}
- to_retrive = {}
- for item in object_list:
- ct_id = getattr(item, ct_field)
- fk_id = getattr(item, fk_field)
- if ct_id not in to_retrive:
- to_retrive[ct_id] = {'model': getattr(item, related_field.ct_field).model_class(), 'pks': set([])}
- to_retrive[ct_id]['pks'].update([fk_id])
- for key in to_retrive:
- objects = to_retrive[key]['model']._default_manager.filter(pk__in=list(to_retrive[key]['pks']))
- result[key] = dict([[obj.pk, obj] for obj in objects])
- for item in object_list:
- setattr(item, field, result[getattr(item, ct_field)][int(getattr(item, fk_field))])
- def load_related_fk(object_list, field):
- if not object_list:
- return object_list
- related_field = object_list.model._meta.get_field(field)
- attname = related_field.get_attname()
- pks = list(set([getattr(obj, attname) for obj in object_list if getattr(obj, attname)]))
- objects = related_field.rel.to._default_manager.filter(pk__in=pks)
- related_dict = {}
- for obj in objects:
- related_dict[obj.pk] = obj
- for obj in object_list:
- try:
- setattr(obj, field, related_dict[getattr(obj, attname)])
- except KeyError:
- pass
- return object_list
|