

@require_instance_manager
def similar_objects(self):
    lookup_kwargs = self._lookup_kwargs()
    lookup_keys = sorted(lookup_kwargs)
    qs = self.through.objects.values(*lookup_kwargs.keys())
    qs = qs.annotate(n=models.Count('pk'))
    qs = qs.exclude(**lookup_kwargs)
    qs = qs.filter(tag__in=self.all())
    qs = qs.order_by('-n')
    items = {
        
    }
    if (len(lookup_keys) == 1):
        f = self.through._meta.get_field_by_name(lookup_keys[0])[0]
        objs = f.rel.to._default_manager.filter(**{
            ('%s__in' % f.rel.field_name): [r['content_object'] for r in qs],
        })
        for obj in objs:
            items[(getattr(obj, f.rel.field_name),)] = obj
    else:
        preload = {
            
        }
        for result in qs:
            preload.setdefault(result['content_type'], set())
            preload[result['content_type']].add(result['object_id'])
        for (ct, obj_ids) in preload.iteritems():
            ct = ContentType.objects.get_for_id(ct)
            for obj in ct.model_class()._default_manager.filter(pk__in=obj_ids):
                items[(ct.pk, obj.pk)] = obj
    results = []
    for result in qs:
        obj = items[tuple((result[k] for k in lookup_keys))]
        obj.similar_tags = result['n']
        results.append(obj)
    return results

dataset/ETHPy150Open lmorchard/badg.us/vendor-local/lib/python/taggit/managers.py _TaggableManager.similar_objects/original