Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
forwards generic relations
Cache the generic relation field of all the objects
in the queryset, using larger bulk queries ahead of time.
Improved from original by Daniel Roseman:
def cache_generics(queryset):
generics = {}
for item in queryset:
if item.object_id is not None:
generics.setdefault(item.content_type_id, set()).add(item.object_id)
content_types = ContentType.objects.in_bulk(generics.keys())
relations = {}
for ct, fk_list in generics.iteritems():
ct_model = content_types[ct].model_class()
relations[ct] = ct_model.objects.in_bulk(list(fk_list))
for item in queryset:
cached_val = relations[item.content_type_id][item.object_id]
except KeyError:
cached_val = None
setattr(item, '_content_object_cache', cached_val)
Copy link

BertrandBordage commented Nov 24, 2014

Excellent! Still working with Django 1.6.

Copy link

biermeester commented Jan 22, 2016

Still using this in Django 1.8!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment